From 0a0afa255c468b5d3adb6c353461867d889c210b Mon Sep 17 00:00:00 2001
From: rhenck <richard.henck@iqb.hu-berlin.de>
Date: Wed, 9 Feb 2022 10:59:07 +0100
Subject: [PATCH] Refactor imported unit version to not rely on semver package

The package was not a proper ECMA Script package and therefore can not
be tree shaken properly and would unnecessarily increase the package
size.
---
 package-lock.json                             | 11 +--
 package.json                                  |  2 -
 .../common/classes/importedModuleVersion.ts   | 88 +++++++++----------
 3 files changed, 44 insertions(+), 57 deletions(-)

diff --git a/package-lock.json b/package-lock.json
index 72a625df4..66a16a19d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2287,12 +2287,6 @@
         "@types/prosemirror-transform": "*"
       }
     },
-    "@types/semver": {
-      "version": "7.3.9",
-      "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.9.tgz",
-      "integrity": "sha512-L/TMpyURfBkf+o/526Zb6kd/tchUP3iBDEPjqjb+U2MAJhVRxxrmr2fwpe08E7QsV7YLcpq0tUaQ9O9x97ZIxQ==",
-      "dev": true
-    },
     "@types/source-list-map": {
       "version": "0.1.2",
       "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz",
@@ -8073,6 +8067,7 @@
       "version": "6.0.0",
       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
       "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dev": true,
       "requires": {
         "yallist": "^4.0.0"
       }
@@ -11631,6 +11626,7 @@
       "version": "7.3.5",
       "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz",
       "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==",
+      "dev": true,
       "requires": {
         "lru-cache": "^6.0.0"
       }
@@ -14671,7 +14667,8 @@
     "yallist": {
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
-      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+      "dev": true
     },
     "yaml": {
       "version": "1.10.2",
diff --git a/package.json b/package.json
index 08fbd436c..795d17b82 100644
--- a/package.json
+++ b/package.json
@@ -79,7 +79,6 @@
     "ngx-tiptap": "^3.0.4",
     "prosemirror-state": "^1.3.4",
     "rxjs": "~6.6.0",
-    "semver": "^7.3.5",
     "testcafe": "^1.17.0",
     "tslib": "^2.1.0",
     "zone.js": "~0.11.4"
@@ -91,7 +90,6 @@
     "@iqb/eslint-config": "^1.0.2",
     "@types/jasmine": "~3.6.0",
     "@types/node": "^12.11.1",
-    "@types/semver": "^7.3.9",
     "iqb-dev-components": "^1.4.0",
     "jasmine-core": "^3.8.0",
     "karma": "~6.3.0",
diff --git a/projects/common/classes/importedModuleVersion.ts b/projects/common/classes/importedModuleVersion.ts
index e5da40381..38e48342c 100644
--- a/projects/common/classes/importedModuleVersion.ts
+++ b/projects/common/classes/importedModuleVersion.ts
@@ -1,62 +1,54 @@
-export class ImportModuleVersion {
-  private static unitLoaded: boolean;
-  private static version: string;
+export class ImportedModuleVersion {
+  static unitLoaded: boolean;
+  static version: string | null = null; // null for invalid
 
-  static setVersion(importedModuleVersion: string): void {
-    ImportModuleVersion.unitLoaded = false;
-    ImportModuleVersion.version = importedModuleVersion;
-  }
-
-  static setUnitLoaded(): void {
-    ImportModuleVersion.unitLoaded = true;
-  }
-
-  static isUnitLoaded(): boolean {
-    return ImportModuleVersion.unitLoaded;
-  }
-
-  static getVersion(): { fullName: string, type: string, version: number[] } {
-    return {
-      fullName: ImportModuleVersion.version,
-      type: ImportModuleVersion.getVersionType(),
-      version: ImportModuleVersion.getVersionNumbers()
-    };
+  static setVersion(importedModuleVersion: string | undefined): void {
+    ImportedModuleVersion.unitLoaded = false;
+    if (importedModuleVersion) {
+      ImportedModuleVersion.verifyVersionString(importedModuleVersion) ?
+        ImportedModuleVersion.version = importedModuleVersion.split('@')[1] :
+        ImportedModuleVersion.version = null;
+    }
   }
 
-  private static getVersionType(): string {
-    if (ImportModuleVersion.version && ImportModuleVersion.version.length) {
-      const importedModuleVersionArray = ImportModuleVersion.version.split('@');
-      if (importedModuleVersionArray.length === 2) {
-        return importedModuleVersionArray[0];
-      }
-    }
-    return 'none';
+  /*
+  Checks for existence of parts before and after the @ sign. The first part has to be
+  'iqb-aspect-definition', which indicates a known and supported version.
+  The second part has to have exactly 3 numbers, split at the . (dot) sign.
+   */
+  static verifyVersionString(versionString: string): boolean {
+    if (versionString.split('@').length !== 2 ||
+        versionString.split('@')[0] !== 'iqb-aspect-definition' ||
+        versionString.split('@')[1].split('.').length !== 3) {
+      console.error('Error reading the unit definition!');
+      return false;
+    }
+    return true;
   }
 
-  private static getVersionNumbers(): number[] {
-    if (ImportModuleVersion.version && ImportModuleVersion.version.length) {
-      const importedModuleVersionArray = ImportModuleVersion.version.split('@');
-      if (importedModuleVersionArray.length === 2) {
-        const versionArray = importedModuleVersionArray[1].split('.');
-        if (versionArray.length === 3) {
-          return versionArray.map(number => Number(number));
-        }
-      }
-    }
-    return [0, 0, 0];
-  }
+  static isGreaterThanOrEqualTo(versionString: string): boolean {
+    if (!ImportedModuleVersion.version) {
+      return false;
+    }
 
-  static verifyVersion(): boolean {
-    if (!ImportModuleVersion.getVersion().fullName) {
+    if (ImportedModuleVersion.version[0] < versionString[0]) {
       return false;
     }
-    if (ImportModuleVersion.getVersionType() !== 'iqb-aspect-definition') {
+    if (ImportedModuleVersion.version[0] > versionString[0]) {
+      return true;
+    }
+
+    if (ImportedModuleVersion.version[1] < versionString[1]) {
       return false;
     }
-    const numbers = ImportModuleVersion.getVersionNumbers();
-    if (numbers[0] < 1) {
+    if (ImportedModuleVersion.version[1] > versionString[1]) {
+      return true;
+    }
+
+    if (ImportedModuleVersion.version[2] < versionString[2]) {
       return false;
     }
-    return numbers[1] >= 1;
+
+    return true;
   }
 }
-- 
GitLab