From 572e543ba82727e187fa8e44887e9ec39889e922 Mon Sep 17 00:00:00 2001
From: thepaperpilot <thepaperpilot@gmail.com>
Date: Sun, 27 Mar 2022 19:06:58 -0500
Subject: [PATCH] Made all properties in FeatureNode non-optional

---
 src/components/Context.vue           |  4 ++--
 src/features/links/Link.vue          | 26 ++++++++++++--------------
 src/features/links/Links.vue         |  7 +++----
 src/features/particles/Particles.vue |  7 +++----
 src/game/layers.tsx                  |  4 ++--
 5 files changed, 22 insertions(+), 26 deletions(-)

diff --git a/src/components/Context.vue b/src/components/Context.vue
index 0a44d4a..867ffe1 100644
--- a/src/components/Context.vue
+++ b/src/components/Context.vue
@@ -24,11 +24,11 @@ const observerOptions = {
 provide(RegisterNodeInjectionKey, (id, element) => {
     const observer = new MutationObserver(() => updateNode(id));
     observer.observe(element, observerOptions);
-    nodes.value[id] = { element, observer };
+    nodes.value[id] = { element, observer, rect: element.getBoundingClientRect() };
     nextTick(() => updateNode(id));
 });
 provide(UnregisterNodeInjectionKey, id => {
-    nodes.value[id]?.observer?.disconnect();
+    nodes.value[id]?.observer.disconnect();
     nodes.value[id] = undefined;
 });
 provide(NodesInjectionKey, nodes);
diff --git a/src/features/links/Link.vue b/src/features/links/Link.vue
index 9159f87..8f9e17f 100644
--- a/src/features/links/Link.vue
+++ b/src/features/links/Link.vue
@@ -26,13 +26,12 @@ const props = toRefs(_props);
 const startPosition = computed(() => {
     const rect = props.startNode.value.rect;
     const boundingRect = props.boundingRect.value;
-    const position =
-        rect && boundingRect
-            ? {
-                  x: rect.x + rect.width / 2 - boundingRect.x,
-                  y: rect.y + rect.height / 2 - boundingRect.y
-              }
-            : { x: 0, y: 0 };
+    const position = boundingRect
+        ? {
+              x: rect.x + rect.width / 2 - boundingRect.x,
+              y: rect.y + rect.height / 2 - boundingRect.y
+          }
+        : { x: 0, y: 0 };
     if (props.link.value.offsetStart) {
         position.x += props.link.value.offsetStart.x;
         position.y += props.link.value.offsetStart.y;
@@ -43,13 +42,12 @@ const startPosition = computed(() => {
 const endPosition = computed(() => {
     const rect = props.endNode.value.rect;
     const boundingRect = props.boundingRect.value;
-    const position =
-        rect && boundingRect
-            ? {
-                  x: rect.x + rect.width / 2 - boundingRect.x,
-                  y: rect.y + rect.height / 2 - boundingRect.y
-              }
-            : { x: 0, y: 0 };
+    const position = boundingRect
+        ? {
+              x: rect.x + rect.width / 2 - boundingRect.x,
+              y: rect.y + rect.height / 2 - boundingRect.y
+          }
+        : { x: 0, y: 0 };
     if (props.link.value.offsetEnd) {
         position.x += props.link.value.offsetEnd.x;
         position.y += props.link.value.offsetEnd.y;
diff --git a/src/features/links/Links.vue b/src/features/links/Links.vue
index cab8aae..1f821c8 100644
--- a/src/features/links/Links.vue
+++ b/src/features/links/Links.vue
@@ -14,7 +14,7 @@
 
 <script setup lang="ts">
 import { Link } from "features/links/links";
-import { NodesInjectionKey } from "game/layers";
+import { FeatureNode, NodesInjectionKey } from "game/layers";
 import { computed, inject, nextTick, onMounted, ref, toRef } from "vue";
 import LinkVue from "./Link.vue";
 
@@ -43,9 +43,8 @@ function updateNodes() {
         isDirty = false;
         nextTick(() => {
             boundingRect.value = resizeListener.value?.getBoundingClientRect();
-            Object.values(nodes.value).forEach(
-                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-                node => (node!.rect = node?.element.getBoundingClientRect())
+            (Object.values(nodes.value) as FeatureNode[]).forEach(
+                node => (node.rect = node.element.getBoundingClientRect())
             );
             isDirty = true;
         });
diff --git a/src/features/particles/Particles.vue b/src/features/particles/Particles.vue
index afe40be..6318525 100644
--- a/src/features/particles/Particles.vue
+++ b/src/features/particles/Particles.vue
@@ -35,7 +35,7 @@ import { Emitters } from "tsparticles-plugin-emitters/Emitters";
 import { EmitterContainer } from "tsparticles-plugin-emitters/EmitterContainer";
 import { defineComponent, inject, nextTick, onMounted, PropType, ref } from "vue";
 import { ParticlesComponent } from "particles.vue3";
-import { NodesInjectionKey } from "game/layers";
+import { FeatureNode, NodesInjectionKey } from "game/layers";
 
 // TODO get typing support on the Particles component
 export default defineComponent({
@@ -93,9 +93,8 @@ export default defineComponent({
                 nextTick(() => {
                     if (resizeListener.value != null && props.onContainerResized) {
                         // TODO don't overlap with Links.vue
-                        Object.values(nodes.value).forEach(
-                            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
-                            node => (node!.rect = node?.element.getBoundingClientRect())
+                        (Object.values(nodes.value) as FeatureNode[]).forEach(
+                            node => (node.rect = node.element.getBoundingClientRect())
                         );
                         props.onContainerResized(resizeListener.value.getBoundingClientRect());
                     }
diff --git a/src/game/layers.tsx b/src/game/layers.tsx
index 5733ade..ce99ecf 100644
--- a/src/game/layers.tsx
+++ b/src/game/layers.tsx
@@ -22,8 +22,8 @@ import { persistent, PersistentRef } from "./persistence";
 import player from "./player";
 
 export interface FeatureNode {
-    rect?: DOMRect;
-    observer?: MutationObserver;
+    rect: DOMRect;
+    observer: MutationObserver;
     element: HTMLElement;
 }