Repository: earthhistoryviz/tsconline
Pull request #382: Tsc 635 pdf file frontend download maybe view
Author: login: lbostre
Created: 2025-03-25T20:28:54Z | Merged: 2025-04-18T02:00:30Z

- ability to download files that are attached to datapacks
- 
![4a73d11c4e24ee0309b32022ba632ccb](https://github.com/user-attachments/assets/260fbd1a-eb8b-4668-8d52-f47e45898043)
![4d27b08d53165bbbb354b367b4e0f329](https://github.com/user-attachments/assets/53ccb3bb-19ce-4989-87ee-2bfe4f7ade8a)
![73b5c31d99d6e1d07b60b24f67d89b42](https://github.com/user-attachments/assets/106abcca-d85c-41ed-a336-3484336fd86f)
![c87eda6d9c6e38eae6c7fe56c4a9ed91](https://github.com/user-attachments/assets/a4aa16ef-45bf-4305-a95d-168a49f9665c)




Diff:
diff --git a/app/src/DatapackProfile.tsx b/app/src/DatapackProfile.tsx
index d7c607ef01..961df935ea 100644
--- a/app/src/DatapackProfile.tsx
+++ b/app/src/DatapackProfile.tsx
@@ -35,7 +35,9 @@ import {
   DatapackUniqueIdentifier,
   isDatapackTypeString,
   isUserDatapack,
-  isOfficialDatapack
+  isOfficialDatapack,
+  checkUserAllowedDownloadDatapack,
+  getUUIDOfDatapackType
 } from "@tsconline/shared";
 import { ResponsivePie } from "@nivo/pie";
 import { useTranslation } from "react-i18next";
@@ -382,6 +384,15 @@ const About: React.FC<AboutProps> = observer(({ datapack }) => {
       window.removeEventListener("beforeunload", handleBeforeUnload);
     };
   }, [state.datapackProfilePage.unsavedChanges]);
+
+  function downloadDatapackFiles() {
+    if (checkUserAllowedDownloadDatapack(state.user, datapack)) {
+      actions.fetchDatapackFiles(datapack.title, getUUIDOfDatapackType(datapack), datapack.isPublic);
+    } else {
+      actions.pushSnackbar("You are not allowed to download this datapack's pdfs.", "warning");
+    }
+  }
+
   return (
     <Box className={styles.about} bgcolor="secondaryBackground.main">
       <div className={styles.ah}>
@@ -416,6 +427,17 @@ const About: React.FC<AboutProps> = observer(({ datapack }) => {
         <div className={styles.ai}>
           <Tags tags={datapack.tags} />
         </div>
+        <div className={styles.ai}>
+          {datapack.hasFiles && (
+            <TSCButton
+              variant="contained"
+              color="primary"
+              sx={{ marginTop: 2 }}
+              onClick={() => downloadDatapackFiles()}>
+              {t("workshops.details-page.download-button")}
+            </TSCButton>
+          )}
+        </div>
       </div>
       <div className={styles.additional}>
         <Typography className={styles.dt}>Description</Typography>
diff --git a/app/src/components/datapack_display/datapack-upload-form-hook.ts b/app/src/components/datapack_display/datapack-upload-form-hook.ts
index bdfd1ea753..d8f93cf5b7 100644
--- a/app/src/components/datapack_display/datapack-upload-form-hook.ts
+++ b/app/src/components/datapack_display/datapack-upload-form-hook.ts
@@ -32,6 +32,7 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
   const [priority, setPriority] = useState(0);
   const [profileImage, setProfileImage] = useState<File | null>(null);
   const profileImageRef = useRef<HTMLInputElement>(null);
+  const [hasFiles, setHasFiles] = useState(false);
   const filename = file?.name || "";
   const metadata: DatapackMetadata = {
     storedFileName: "", // don't write storedFileName to the metadata (need this to be set for types)
@@ -44,6 +45,7 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
     tags,
     priority,
     size: "0", // placeholder, this will get set after the file is uploaded
+    hasFiles,
     ...type,
     ...(contact && { contact }),
     ...(notes && { notes }),
@@ -128,9 +130,16 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
       }
     });
     setPDFFiles(Array.from(fileMap.values()));
+    setHasFiles(true);
   };
   const handlePDFFileDelete = (fileName: string) => {
-    setPDFFiles((prevFiles) => prevFiles.filter((file) => file.name !== fileName));
+    setPDFFiles((prevFiles) => {
+      const updatedFiles = prevFiles.filter((file) => file.name !== fileName);
+      if (updatedFiles.length === 0) {
+        setHasFiles(false);
+      }
+      return updatedFiles;
+    });
     actions.removeAllErrors();
   };
 
@@ -146,6 +155,7 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
     setDate(null);
     setFile(null);
     setPDFFiles([]);
+    setHasFiles(false);
   };
   return {
     state: {
@@ -163,7 +173,8 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
       file,
       pdfFiles,
       profileImageRef,
-      priority
+      priority,
+      hasFiles
     },
     setters: {
       setTitle,
@@ -176,7 +187,8 @@ const useDatapackUploadForm = (props: DatapackUploadFormProps) => {
       setReferences,
       setDate,
       setFile,
-      setPriority
+      setPriority,
+      setHasFiles
     },
     handlers: {
       resetForm,
diff --git a/app/src/state/actions/admin-actions.ts b/app/src/state/actions/admin-actions.ts
index 4625b53bec..f47738c069 100644
--- a/app/src/state/actions/admin-actions.ts
+++ b/app/src/state/actions/admin-actions.ts
@@ -350,6 +350,7 @@ export const adminUploadOfficialDatapack: UploadDatapackMethodType = action(
     formData.append("isPublic", String(isPublic));
     formData.append("type", metadata.type);
     formData.append("priority", String(metadata.priority));
+    formData.append("hasFiles", String(metadata.hasFiles));
     if (datapackProfilePicture) formData.append("datapack-image", datapackProfilePicture);
     if (notes) formData.append("notes", notes);
     if (date) formData.append("date", date);
diff --git a/app/src/state/actions/general-actions.ts b/app/src/state/actions/general-actions.ts
index ddf9547e08..984512a3cd 100644
--- a/app/src/state/actions/general-actions.ts
+++ b/app/src/state/actions/general-actions.ts
@@ -137,6 +137,43 @@ export const fetchPublicOfficialDatapack = action(
   }
 );
 
+export const fetchDatapackFiles = action(async (datapackTitle: string, uuid: string, isPublic: boolean) => {
+  const recaptchaToken = await getRecaptchaToken("fetchDatapackFiles");
+  if (!recaptchaToken) return null;
+  try {
+    const response = await fetcher(
+      `/user/datapack/download/files/${encodeURIComponent(datapackTitle)}/${uuid}/${isPublic}`,
+      {
+        method: "GET",
+        credentials: "include",
+        headers: {
+          "recaptcha-token": recaptchaToken
+        }
+      }
+    );
+    const file = await response.blob();
+    if (response.ok) {
+      if (file) {
+        try {
+          await downloadFile(file, `FilesFor${datapackTitle}.zip`);
+        } catch (e) {
+          pushError(ErrorCodes.INVALID_PATH);
+        }
+      }
+    } else {
+      displayServerError(
+        response,
+        ErrorCodes.INVALID_SERVER_DATAPACK_REQUEST,
+        ErrorMessages[ErrorCodes.INVALID_SERVER_DATAPACK_REQUEST]
+      );
+    }
+  } catch (e) {
+    if ((e as Error).name === "AbortError") return;
+    displayServerError(null, ErrorCodes.SERVER_RESPONSE_ERROR, ErrorMessages[ErrorCodes.SERVER_RESPONSE_ERROR]);
+    console.error(e);
+  }
+});
+
 export const fetchFaciesPatterns = action("fetchFaciesPatterns", async () => {
   try {
     const response = await fetcher("/facies-patterns");
@@ -305,11 +342,13 @@ export const uploadUserDatapack = action(
     if (notes) formData.append("notes", notes);
     if (date) formData.append("date", date);
     if (contact) formData.append("contact", contact);
+    formData.append("hasFiles", String(metadata.hasFiles));
     if (pdfFiles?.length) {
       pdfFiles.forEach((pdfFile) => {
         formData.append("pdfFiles[]", pdfFile);
       });
     }
+
     formData.append("priority", String(metadata.priority));
     try {
       const response = await fetcher(`/user/datapack`, {
@@ -332,6 +371,7 @@ export const uploadUserDatapack = action(
         if (metadata.isPublic) {
           refreshPublicDatapacks();
         }
+
         pushSnackbar("Successfully uploaded " + title + " datapack", "success");
       } else {
         if (response.status === 403) {
@@ -1269,7 +1309,8 @@ export const resetEditableDatapackMetadata = action((metadata: EditableDatapackM
     type: metadata.type,
     authoredBy: metadata.authoredBy,
     priority: metadata.priority,
-    references: metadata.references
+    references: metadata.references,
+    hasFiles: metadata.hasFiles
   };
 });
 export const setUnsavedChanges = action((unsavedChanges: boolean) => {
diff --git a/server/__tests__/__data__/column-keys.json b/server/__tests__/__data__/column-keys.json
index ea1edd31b0..bad22a27ac 100644
--- a/server/__tests__/__data__/column-keys.json
+++ b/server/__tests__/__data__/column-keys.json
@@ -535,7 +535,8 @@
     "totalColumns": 8,
     "datapackImage": "image",
     "isPublic": true,
-    "type": "official"
+    "type": "official",
+    "hasFiles": false
   },
   "general-parse-datapacks-test-2-key": {
     "columnInfo": {
@@ -1464,7 +1465,8 @@
     "authoredBy": "authoredBy",
     "datapackImage": "image",
     "isPublic": true,
-    "type": "official"
+    "type": "official",
+    "hasFiles": false
   },
   "column-types-facies-key": {
     "FaciesOne": {
@@ -2803,6 +2805,7 @@
     "authoredBy": "authoredBy",
     "datapackImage": "image",
     "isPublic": true,
-    "type": "official"
+    "type": "official",
+    "hasFiles": false
   }
-}
\ No newline at end of file
+}
diff --git a/server/__tests__/admin-routes.test.ts b/server/__tests__/admin-routes.test.ts
index 417bc555d0..8f7be2a8b6 100644
--- a/server/__tests__/admin-routes.test.ts
+++ b/server/__tests__/admin-routes.test.ts
@@ -308,7 +308,8 @@ const testDatapackDescription: DatapackMetadata = {
   type: "user",
   uuid: "test-uuid",
   isPublic: false,
-  priority: 0
+  priority: 0,
+  hasFiles: false
 };
 
 const testUserWorkshop = {
diff --git a/server/__tests__/parse-datapacks.test.ts b/server/__tests__/parse-datapacks.test.ts
index 614050b496..6f43f88843 100644
--- a/server/__tests__/parse-datapacks.test.ts
+++ b/server/__tests__/parse-datapacks.test.ts
@@ -68,7 +68,8 @@ describe("general parse-datapacks tests", () => {
     datapackImage: "image",
     isPublic: true,
     type: "official",
-    priority: 0
+    priority: 0,
+    hasFiles: false
   };
   it("should parse africa general datapack", async () => {
     const datapacks = await parseDatapacks(
diff --git a/server/__tests__/upload-datapack.test.ts b/server/__tests__/upload-datapack.test.ts
index b247bfa0ad..5c6a939d3c 100644
--- a/server/__tests__/upload-datapack.test.ts
+++ b/server/__tests__/upload-datapack.test.ts
@@ -126,6 +126,7 @@ describe("getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack", () =>
   it("should return 400 if processMultipartPartsForDatapackUpload does not return file or fields", async () => {
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: {} as MultipartFile,
+      pdfFields: {},
       fields: { filepath: "", originalFileName: "", storedFileName: "" }
     });
     const val = await getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack("uuid", formData);
@@ -135,6 +136,7 @@ describe("getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack", () =>
   it("should return 500 if uploadUserDatapackHandler throws an error", async () => {
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: { file: { bytesRead: 1 } } as MultipartFile,
+      pdfFields: {},
       fields: { filepath: "test", originalFileName: "test", storedFileName: "test" }
     });
     uploadUserDatapackHandler.mockRejectedValueOnce(new Error("error"));
@@ -146,6 +148,7 @@ describe("getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack", () =>
   it("should return operation code if uploadUserDatapackHandler returns operation result", async () => {
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: { file: { bytesRead: 1 } } as MultipartFile,
+      pdfFields: {},
       fields: { filepath: "test", originalFileName: "test", storedFileName: "test" }
     });
     uploadUserDatapackHandler.mockResolvedValueOnce({ code: 999, message: "error" });
@@ -156,6 +159,7 @@ describe("getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack", () =>
   it("should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful", async () => {
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: { file: { bytesRead: 1 } } as MultipartFile,
+      pdfFields: {},
       fields: { filepath: "test", originalFileName: "test", storedFileName: "test" }
     });
     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMetadata);
@@ -243,6 +247,7 @@ describe("processAndUploadDatapack", () => {
     vi.clearAllMocks();
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: { file: { bytesRead: 1 } } as MultipartFile,
+      pdfFields: {},
       fields: {
         filepath: "test",
         originalFileName: "test",
@@ -315,6 +320,7 @@ describe("processAndUploadDatapack", () => {
     doesDatapackFolderExistInAllUUIDDirectories.mockResolvedValueOnce(true);
     processMultipartPartsForDatapackUpload.mockResolvedValueOnce({
       file: { file: { bytesRead: 1 } } as MultipartFile,
+      pdfFields: {},
       fields: { filepath: "test", originalFileName: "test", storedFileName: "test" }
     });
     const val = await processAndUploadDatapack("uuid", formData);
diff --git a/server/__tests__/upload-handlers.test.ts b/server/__tests__/upload-handlers.test.ts
index c0a96414f7..f1f93868ca 100644
--- a/server/__tests__/upload-handlers.test.ts
+++ b/server/__tests__/upload-handlers.test.ts
@@ -141,7 +141,8 @@ describe("uploadUserDatapackHandler", () => {
     uuid: "user",
     isPublic: "true",
     type: "type",
-    priority: "1"
+    priority: "1",
+    hasFiles: "true"
   };
   beforeEach(async () => {
     vi.clearAllMocks();
@@ -165,7 +166,8 @@ describe("uploadUserDatapackHandler", () => {
     { originalFileName: "" },
     { storedFileName: "" },
     { isPublic: "" },
-    { type: "" }
+    { type: "" },
+    { hasFiles: "" }
   ])(`should return a 400 error if %p is missing`, async (field) => {
     const val = await uploadUserDatapackHandler({ ...fields, ...field }, 1);
     expect(isOperationResult(val)).toBe(true);
@@ -279,7 +281,8 @@ describe("uploadUserDatapackHandler", () => {
       type: fields.type,
       uuid: fields.uuid,
       isPublic: Boolean(fields.isPublic),
-      priority: parseInt(fields.priority)
+      priority: parseInt(fields.priority),
+      hasFiles: Boolean(fields.hasFiles)
     });
   });
   it("should return a 400 error if title is too long", async () => {
diff --git a/server/__tests__/user-routes.test.ts b/server/__tests__/user-routes.test.ts
index 4ee298b673..a58de5ed8f 100644
--- a/server/__tests__/user-routes.test.ts
+++ b/server/__tests__/user-routes.test.ts
@@ -1321,3 +1321,77 @@ describe("deleteUserHistory tests", () => {
     expect(await response.json()).toEqual({ message: "History deleted" });
   });
 });
+
+describe("fetchDatapacksFiles tests", () => {
+  const findUser = vi.spyOn(database, "findUser");
+  beforeEach(() => {
+    vi.clearAllMocks();
+  });
+
+  it("should return 401 if user is not logged in", async () => {
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/title/12345/true`,
+      headers: { "mock-uuid": "" }
+    });
+    expect(response.statusCode).toBe(401);
+    expect(await response.json()).toEqual({ error: "Unauthorized access" });
+  });
+
+  it("should reply 401 if user is not found in database", async () => {
+    findUser.mockResolvedValueOnce([]);
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/title/12345/true`,
+      headers
+    });
+    expect(await response.json()).toEqual({ error: "Unauthorized access" });
+    expect(response.statusCode).toBe(401);
+  });
+
+  it("should return 401 if datapackTitle is invalid", async () => {
+    findUser.mockResolvedValueOnce([testUser as User]);
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/invalid:title/12345/true`,
+      headers
+    });
+    expect(response.statusCode).toBe(400);
+    expect(await response.json()).toEqual({ error: "Missing datapack title" });
+  });
+
+  it("should return 500 if the files directory is invalid", async () => {
+    findUser.mockResolvedValueOnce([testUser as User]);
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/testTitle/12345/true`,
+      headers
+    });
+
+    expect(response.statusCode).toBe(500);
+    expect(await response.json()).toEqual({ error: "Invalid directory path" });
+  });
+
+  it("should return 500 if zipfile path is not valid or already exists", async () => {
+    findUser.mockResolvedValueOnce([testUser as User]);
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/testTitle/12345/true`,
+      headers
+    });
+
+    expect(response.statusCode).toBe(500);
+    expect(await response.json()).toEqual({ error: "Invalid directory path" });
+  });
+
+  it("should return 500 if an unknown error occurs while reading", async () => {
+    findUser.mockResolvedValueOnce([testUser as User]);
+    const response = await app.inject({
+      method: "GET",
+      url: `/user/datapack/download/files/testTitle/12345/true`,
+      headers
+    });
+
+    expect(response.statusCode).toBe(500);
+  });
+});
diff --git a/server/assets/dev-config.json b/server/assets/dev-config.json
index 1b95c38861..14f0d11a02 100644
--- a/server/assets/dev-config.json
+++ b/server/assets/dev-config.json
@@ -12,7 +12,8 @@
         "notes": "This is the internal datapack for TimeScale Creator 2020",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Human Evolution",
@@ -29,7 +30,8 @@
         "notes": "Suggest beginning with 0.05 to 2 Ma with vertical scale of 8",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Australia",
@@ -47,7 +49,8 @@
         "notes": "Contact Andrew Kelman for a special Public 'GA-TS_Creator' JAVA version (ca. 25 Mb) that has this Australian dataset and their extensive reconstruction images pre-installed with the full global suite.",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Belgium",
@@ -64,7 +67,8 @@
         ],
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "South American Basins",
@@ -109,7 +113,8 @@
         ],
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Africa Bight",
@@ -122,7 +127,8 @@
         "references": [],
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "British Isles",
@@ -140,7 +146,8 @@
         "notes": "Each set of columns is separated by a strip \"color of time\" of the international-stage divisions to clarify the temporal correlations",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Evolution of Modern Life",
@@ -158,7 +165,8 @@
         "contact": "James Ogg: jogg@purdue.edu",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Vertebrate Evolution",
@@ -175,7 +183,8 @@
         "notes": "Evolution branching is best visualized using intervals greater than 60 myr and with a vertical scale of 0.5 or less. Ranges of different selected fossil vertebrates are defaulted OFF (turn on from within each directory). ",
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     },
     {
         "title": "Human Culture",
@@ -190,6 +199,7 @@
         "tags": [],
         "type": "official",
         "isPublic": true,
-        "priority": 1
+        "priority": 1,
+        "hasFiles":  false
     }
-]
\ No newline at end of file
+]
diff --git a/server/assets/translation.xlsx b/server/assets/translation.xlsx
index 0930ceb991..76602dc5e0 100644
Binary files a/server/assets/translation.xlsx and b/server/assets/translation.xlsx differ
diff --git a/server/src/index.ts b/server/src/index.ts
index 4d020384f0..b31da12928 100644
--- a/server/src/index.ts
+++ b/server/src/index.ts
@@ -373,7 +373,6 @@ server.post(
   },
   routes.fetchImage
 );
-
 setInterval(async () => {
   await checkFileMetadata(assetconfigs.fileMetadata)
     .catch((e) => {
diff --git a/server/src/migrate-cached-datapacks.ts b/server/src/migrate-cached-datapacks.ts
index 5f4f4eb153..ae21d59fdd 100644
--- a/server/src/migrate-cached-datapacks.ts
+++ b/server/src/migrate-cached-datapacks.ts
@@ -72,7 +72,7 @@ function extraMetadataFromUnknown(datapack: any, partial: Partial<DatapackMetada
   migrateImageToDatapackImage(datapack);
   const metadata: DatapackMetadata = {
     title: "title" in datapack ? datapack.title : "",
-    authoredBy: "authoredBy" in datapack ? datapack.authoredBy : "Unknwon",
+    authoredBy: "authoredBy" in datapack ? datapack.authoredBy : "Unknown",
     contact: "contact" in datapack ? datapack.contact : "",
     notes: "notes" in datapack ? datapack.notes : "",
     date: "date" in datapack ? datapack.date : "",
@@ -86,6 +86,7 @@ function extraMetadataFromUnknown(datapack: any, partial: Partial<DatapackMetada
     storedFileName: "storedFileName" in datapack ? datapack.storedFileName : "",
     datapackImage: "datapackImage" in datapack ? datapack.datapackImage : "",
     priority: "priority" in datapack ? datapack.priority : 0,
+    hasFiles: "hasFiles" in datapack ? datapack.hasFiles : false,
     ...partial
   };
   assertDatapackMetadata(metadata);
diff --git a/server/src/routes/user-auth.ts b/server/src/routes/user-auth.ts
index dabe800600..e84050a273 100644
--- a/server/src/routes/user-auth.ts
+++ b/server/src/routes/user-auth.ts
@@ -5,7 +5,8 @@ import {
   requestDownload,
   uploadDatapack,
   userDeleteDatapack,
-  fetchWorkshopDatapack
+  fetchWorkshopDatapack,
+  downloadDatapackFilesZip
 } from "./user-routes.js";
 import { findUser } from "../database.js";
 import { checkRecaptchaToken } from "../verify.js";
@@ -77,6 +78,15 @@ export const userRoutes = async (fastify: FastifyInstance, _options: RegisterOpt
       needEncryption: { type: "boolean" }
     }
   };
+  const downloadDatapackFilesZipParams = {
+    type: "object",
+    properties: {
+      datapackTitle: { type: "string" },
+      uuid: { type: "string" },
+      isPublic: { type: "boolean" }
+    },
+    required: ["datapackTitle", "uuid", "isPublic"]
+  };
   fastify.addHook("preHandler", verifySession);
   fastify.addHook("preHandler", verifyRecaptcha);
   fastify.get(
@@ -117,4 +127,12 @@ export const userRoutes = async (fastify: FastifyInstance, _options: RegisterOpt
     },
     fetchWorkshopDatapack
   );
+  fastify.get(
+    "/datapack/download/files/:datapackTitle/:uuid/:isPublic",
+    {
+      config: { rateLimit: looseRateLimit },
+      schema: { params: downloadDatapackFilesZipParams }
+    },
+    downloadDatapackFilesZip
+  );
 };
diff --git a/server/src/routes/user-routes.ts b/server/src/routes/user-routes.ts
index 14ac0ec2d7..fffea7cd2a 100644
--- a/server/src/routes/user-routes.ts
+++ b/server/src/routes/user-routes.ts
@@ -1,13 +1,25 @@
 import { FastifyRequest, FastifyReply } from "fastify";
 import { rm, mkdir, readFile } from "fs/promises";
 import { getEncryptionDatapackFileSystemDetails, runJavaEncrypt } from "../encryption.js";
-import { assetconfigs, checkHeader, extractMetadataFromDatapack } from "../util.js";
+import {
+  assetconfigs,
+  checkHeader,
+  extractMetadataFromDatapack,
+  verifyFilepath,
+  verifyNonExistentFilepath
+} from "../util.js";
 import { findUser, getActiveWorkshopsUserIsIn } from "../database.js";
 import { deleteUserDatapack, fetchAllUsersDatapacks, fetchUserDatapack } from "../user/user-handler.js";
 import { getWorkshopUUIDFromWorkshopId, verifyWorkshopValidity } from "../workshop/workshop-util.js";
 import { processAndUploadDatapack } from "../upload-datapack.js";
-import { editDatapackMetadataRequestHandler } from "../file-handlers/general-file-handler-requests.js";
+import { createZipFile, editDatapackMetadataRequestHandler } from "../file-handlers/general-file-handler-requests.js";
 import { DatapackMetadata } from "@tsconline/shared";
+import {
+  getPDFFilesDirectoryFromDatapackDirectory,
+  getUsersDatapacksDirectoryFromUUIDDirectory,
+  getUserUUIDDirectory
+} from "../user/fetch-user-files.js";
+import path from "path";
 import { deleteChartHistory, getChartHistory, getChartHistoryMetadata } from "../user/chart-history.js";
 
 export const editDatapackMetadata = async function editDatapackMetadata(
@@ -464,3 +476,66 @@ export const deleteUserHistory = async function deleteUserHistory(
     reply.status(500).send({ error: "Failed to delete history" });
   }
 };
+
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle || /[<>:"/\\|?*]/.test(datapackTitle)) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+
+  if (!datapackFolder.startsWith(datapacksFolder)) {
+    reply.status(400).send({ error: "Invalid datapack title" });
+    return;
+  }
+
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  const zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  if (!zipfile.startsWith(path.join(process.cwd(), directory))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  try {
+    let file;
+    try {
+      if (!zipfile.startsWith(process.cwd())) {
+        reply.status(500).send({ error: "Invalid directory path" });
+      }
+      file = await readFile(zipfile);
+    } catch (e) {
+      const error = e as NodeJS.ErrnoException;
+      if (error.code !== "ENOENT") {
+        reply.status(500).send({ error: "An error occurred: " + e });
+        return;
+      }
+    }
+
+    if (!file) {
+      file = await createZipFile(zipfile, filesDir);
+    }
+    reply.send(file);
+  } catch (e) {
+    const error = e as NodeJS.ErrnoException;
+    if (error.code === "ENOENT") {
+      reply.status(404).send({ error: "Failed to process the file" });
+    } else {
+      reply.status(500).send({ error: "An error occurred: " + e });
+    }
+  }
+};
diff --git a/server/src/upload-handlers.ts b/server/src/upload-handlers.ts
index cae03784e4..4483f051ad 100644
--- a/server/src/upload-handlers.ts
+++ b/server/src/upload-handlers.ts
@@ -93,7 +93,8 @@ export async function uploadUserDatapackHandler(
     uuid,
     datapackImage,
     tempProfilePictureFilepath,
-    priority
+    priority,
+    hasFiles
   } = fields;
   let { references, tags } = fields;
   if (
@@ -106,7 +107,8 @@ export async function uploadUserDatapackHandler(
     !originalFileName ||
     !storedFileName ||
     !isPublic ||
-    !type
+    !type ||
+    !hasFiles
   ) {
     await userUploadHandler(filepath, tempProfilePictureFilepath);
     return { code: 400, message: "Missing required fields" };
@@ -194,6 +196,7 @@ export async function uploadUserDatapackHandler(
       type,
       priority: parseInt(priority),
       isPublic: isPublic === "true",
+      hasFiles: hasFiles === "true",
       size: getBytes(bytes),
       ...(uuid && { uuid }),
       ...(datapackImage && { datapackImage }),
diff --git a/server/src/util.ts b/server/src/util.ts
index 5734dfee34..5dd0d17908 100644
--- a/server/src/util.ts
+++ b/server/src/util.ts
@@ -306,6 +306,7 @@ export function extractMetadataFromDatapack(datapack: Datapack) {
     references: datapack.references,
     isPublic: datapack.isPublic,
     priority: datapack.priority,
+    hasFiles: datapack.hasFiles,
     type: datapack.type,
     ...(datapack.date ? { date: datapack.date } : {}),
     ...(datapack.contact ? { contact: datapack.contact } : {}),
diff --git a/shared/__tests__/util.test.ts b/shared/__tests__/util.test.ts
index b1c9124ae3..b0aafdac63 100644
--- a/shared/__tests__/util.test.ts
+++ b/shared/__tests__/util.test.ts
@@ -1,5 +1,7 @@
-import { describe, test, expect } from "vitest";
-import { roundToDecimalPlace, calculateAutoScale } from "../src/util";
+import { describe, test, expect, it } from "vitest";
+import { roundToDecimalPlace, calculateAutoScale, checkUserAllowedDownloadDatapack } from "../src/util";
+import { DatapackMetadata } from "../src";
+
 describe("roundToDecimalPlace tests", () => {
   test.each([
     [1.234567, 2, 1.23],
@@ -24,3 +26,65 @@ describe("calculateAutoScale tests", () => {
     expect(result).toEqual(expected);
   });
 });
+
+describe("checkUserAllowedDownloadDatapack tests", () => {
+  const uuid = "123e4567-e89b-12d3-a456-426614174000";
+  const testUser = {
+    uuid,
+    userId: 123,
+    email: "test@example.com",
+    emailVerified: 1,
+    invalidateSession: 0,
+    username: "testuser",
+    hashedPassword: "password123",
+    pictureUrl: "https://example.com/picture.jpg",
+    isAdmin: false,
+    isGoogleUser: false,
+    accountType: ""
+  };
+  const testOfficialDatapack: DatapackMetadata = {
+    description: "description",
+    title: "Title",
+    originalFileName: "file.dpk",
+    storedFileName: "tempFileName",
+    size: "size",
+    tags: [],
+    authoredBy: "authoredBy",
+    references: [],
+    datapackImage: "image",
+    isPublic: true,
+    type: "official",
+    priority: 0,
+    hasFiles: false
+  };
+
+  const testPrivateDatapack: DatapackMetadata = {
+    ...testOfficialDatapack,
+    isPublic: false,
+    type: "user",
+    uuid
+  };
+
+  it("should allow admin users to download any datapack", () => {
+    const adminUser = { ...testUser, isAdmin: true };
+    expect(checkUserAllowedDownloadDatapack(adminUser, testOfficialDatapack)).toBe(true);
+  });
+
+  it("should allow download if the datapack is public", () => {
+    expect(checkUserAllowedDownloadDatapack(testUser, testOfficialDatapack)).toBe(true);
+  });
+
+  it("should allow user to download their own datapack", () => {
+    expect(checkUserAllowedDownloadDatapack(testUser, testPrivateDatapack)).toBe(true);
+  });
+
+  it("should not allow user to download another user's private datapack", () => {
+    const privateDatapack: DatapackMetadata = { ...testPrivateDatapack, type: "user", uuid: "another-uuid" };
+    expect(checkUserAllowedDownloadDatapack(testUser, privateDatapack)).toBe(false);
+  });
+
+  it("should not allow user to download a private official datapack", () => {
+    const privateOfficialDatapack: DatapackMetadata = { ...testOfficialDatapack, isPublic: false, type: "official" };
+    expect(checkUserAllowedDownloadDatapack(testUser, privateOfficialDatapack)).toBe(false);
+  });
+});
diff --git a/shared/src/index.ts b/shared/src/index.ts
index f29f56f57e..1869ed503e 100644
--- a/shared/src/index.ts
+++ b/shared/src/index.ts
@@ -108,6 +108,7 @@ export type DatapackMetadata = {
   notes?: string;
   datapackImage?: string;
   priority: number;
+  hasFiles: boolean;
 } & DatapackType;
 
 export type BaseDatapackProps = {
@@ -1302,6 +1303,7 @@ export function assertDatapackMetadata(o: any): asserts o is DatapackMetadata {
   if ("datapackImage" in o && typeof o.datapackImage !== "string")
     throwError("DatapackMetadata", "datapackImage", "string", o.datapackImage);
   if (typeof o.priority !== "number") throwError("DatapackMetadata", "priority", "number", o.priority);
+  if (typeof o.hasFiles !== "boolean") throwError("DatapackMetadata", "hasFiles", "boolean", o.hasFiles);
   assertDatapackType(o);
 }
 export function assertDatapackMetadataArray(o: any): asserts o is DatapackMetadata[] {
diff --git a/shared/src/util.ts b/shared/src/util.ts
index 627211e154..286b2da2ed 100644
--- a/shared/src/util.ts
+++ b/shared/src/util.ts
@@ -1,3 +1,5 @@
+import { DatapackMetadata, SharedUser } from "./index";
+
 export function roundToDecimalPlace(value: number, decimalPlace: number) {
   const factor = Math.pow(10, decimalPlace);
   return Math.round(value * factor) / factor;
@@ -12,3 +14,10 @@ export function calculateAutoScale(min: number, max: number) {
   const scaleStart = 0;
   return { lowerRange, upperRange, scaleStep, scaleStart };
 }
+
+export function checkUserAllowedDownloadDatapack(user: SharedUser, datapack: DatapackMetadata) {
+  if (user.isAdmin || datapack.isPublic || (datapack.type === "user" && datapack.uuid === user.uuid)) {
+    return true;
+  }
+  return false;
+}


Reviews:
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-03-25T20:30:53Z
user: login: paologum
body: ok so i never checked this, but during one of your prs, the admin upload workflow fails for datapacks. can you fix that in this pr because i believe you changed or someone changed the field where the file goes and it may think that the file field is empty or something along those lines.

also does `hasFiles` get sent in the admin actions upload function
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-31T19:20:10Z
user: login: github-advanced-security[bot]
state: COMMENTED
author_association: NONE
submitted_at: 2025-04-02T18:51:32Z
user: login: lbostre
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-02T19:00:44Z
user: login: paologum
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-03T06:24:49Z
user: login: paologum
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-06T20:46:56Z
user: login: paologum
state: CHANGES_REQUESTED
author_association: CONTRIBUTOR
submitted_at: 2025-04-14T20:22:21Z
user: login: paologum
state: APPROVED
author_association: CONTRIBUTOR
submitted_at: 2025-04-18T02:00:25Z

Review comments:
diff_hunk: @@ -130,4 +140,12 @@
     { config: { rateLimit: looseRateLimit }, schema: { params: workshopTitleParams } },
     downloadWorkshopFilesZip
   );
+  fastify.get(
+    "/datapack/download/files/:datapackTitle/:uuid/:isPublic",
+    {
+      config: { rateLimit: moderateRateLimit },
+      schema: { params: downloadDatapackFilesZipParams }
+    },
+    downloadDatapackFilesZip
path: server/src/routes/user-auth.ts
user: login: github-advanced-security[bot]
body: ## Missing rate limiting

This route handler performs [authorization](1), but is not rate-limited.
This route handler performs [authorization](2), but is not rate-limited.
This route handler performs [a file system access](3), but is not rate-limited.

[Show more details](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)
created_at: 2025-03-25T20:30:53Z
author_association: NONE
diff_hunk: @@ -400,3 +410,52 @@
     }
   }
 };
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  const zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  try {
+    let file;
+    try {
+      file = await readFile(zipfile);
path: server/src/routes/user-routes.ts
user: login: github-advanced-security[bot]
body: ## Uncontrolled data used in path expression

This path depends on a [user-provided value](1).

[Show more details](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)
created_at: 2025-03-25T20:30:53Z
author_association: NONE
diff_hunk: @@ -132,6 +132,54 @@ export const fetchPublicOfficialDatapack = action(
   }
 );
 
+export const fetchDatapackFilesForDownload = action(async (datapackTitle: string, uuid: string, isPublic: boolean) => {
+  const recaptchaToken = await getRecaptchaToken("fetchDatapackFilesForDownload");
+  if (!recaptchaToken) return null;
+  try {
+    const response = await fetcher(
+      `/user/datapack/download/files/${encodeURIComponent(datapackTitle)}/${uuid}/${isPublic}`,
path: app/src/state/actions/general-actions.ts
user: login: paologum
body: for the route, since it is a getter the standard is not to include any verbs in the routes so you should remove download in the names
created_at: 2025-03-31T19:10:13Z
author_association: CONTRIBUTOR
diff_hunk: @@ -132,6 +132,54 @@ export const fetchPublicOfficialDatapack = action(
   }
 );
 
+export const fetchDatapackFilesForDownload = action(async (datapackTitle: string, uuid: string, isPublic: boolean) => {
+  const recaptchaToken = await getRecaptchaToken("fetchDatapackFilesForDownload");
+  if (!recaptchaToken) return null;
+  try {
+    const response = await fetcher(
+      `/user/datapack/download/files/${encodeURIComponent(datapackTitle)}/${uuid}/${isPublic}`,
+      {
+        method: "GET",
+        credentials: "include",
+        headers: {
+          "recaptcha-token": recaptchaToken
+        }
+      }
+    );
+    const file = await response.blob();
+    let fileURL = "";
+    if (response.ok) {
+      if (file) {
+        try {
+          const reader = new FileReader();
+          reader.readAsDataURL(file);
+          await new Promise((resolve, reject) => {
+            reader.onloadend = resolve;
+            reader.onerror = reject;
+          });
+          if (typeof reader.result !== "string") {
+            throw new Error("Invalid File");
+          }
+          fileURL = reader.result;
+          await downloadFilesByURL(fileURL, `FilesFor${datapackTitle}.zip`);
+        } catch (e) {
+          pushError(ErrorCodes.INVALID_PATH);
+        }
+      }
path: app/src/state/actions/general-actions.ts
user: login: paologum
body: there is a function called `downloadFile` that you can use for this
created_at: 2025-03-31T19:11:09Z
author_association: CONTRIBUTOR
diff_hunk: @@ -116,3 +116,21 @@ export function checkIfDccDataIsInRange(dccColumn: ColumnInfo, userTopAge: numbe
   }
   return true;
 }
+
+export const downloadFilesByURL = async (fileURL: string, filename: string) => {
+  try {
+    if (!fileURL) {
+      pushError(ErrorCodes.UNABLE_TO_READ_FILE_OR_EMPTY_FILE);
+      return;
+    }
+
+    const aTag = document.createElement("a");
+    aTag.href = fileURL;
+    aTag.setAttribute("download", filename);
+    document.body.appendChild(aTag);
+    aTag.click();
+    aTag.remove();
+  } catch (error) {
+    pushError(ErrorCodes.INVALID_PATH);
+  }
+};
path: app/src/state/actions/util-actions.ts
user: login: paologum
body: same as `downloadFiles` in `non-action-util` unless i'm understanding incorrectly
created_at: 2025-03-31T19:12:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -223,3 +223,7 @@ export function findSerialNum(name: string) {
   }
   return serialNumber;
 }
+
+export function getDatapackOfficialOrUUID(datapack: Datapack) {
+  return datapack.type === "user" ? datapack.uuid : "official";
+}
path: app/src/util/util.ts
user: login: paologum
body: use the `shared` function for `getUUIDOfDatapackType`
created_at: 2025-03-31T19:12:48Z
author_association: CONTRIBUTOR
path: server/assets/translation.xlsx
user: login: paologum
body: you are removing `translation` items or is this the merge conflict
created_at: 2025-03-31T19:13:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -400,3 +411,66 @@ export const downloadWorkshopFilesZip = async function downloadWorkshopFilesZip(
     }
   }
 };
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle || /[<>:"/\\|?*]/.test(datapackTitle)) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+
+  if (!datapackFolder.startsWith(datapacksFolder)) {
+    reply.status(400).send({ error: "Invalid datapack title" });
+    return;
+  }
+
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  let zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  if (!zipfile.startsWith(path.join(process.cwd(), directory))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
path: server/src/routes/user-routes.ts
user: login: paologum
body: i assume you did the bottom if statement for the code ql, but `verifyNonExistent` should handle that so you should remove the second if statement here
created_at: 2025-03-31T19:14:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -400,3 +411,66 @@ export const downloadWorkshopFilesZip = async function downloadWorkshopFilesZip(
     }
   }
 };
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle || /[<>:"/\\|?*]/.test(datapackTitle)) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+
+  if (!datapackFolder.startsWith(datapacksFolder)) {
+    reply.status(400).send({ error: "Invalid datapack title" });
+    return;
+  }
+
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  let zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  if (!zipfile.startsWith(path.join(process.cwd(), directory))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  try {
+    let file;
+    try {
+      zipfile = fs.realpathSync(zipfile);
+      if (!zipfile.startsWith(process.cwd())) {
+        reply.status(500).send({ error: "Invalid directory path" });
+      }
+      file = await readFile(zipfile);
+    } catch (e) {
+      const error = e as NodeJS.ErrnoException;
+      if (error.code !== "ENOENT") {
+        reply.status(500).send({ error: "An error occurred: " + e });
+        return;
+      }
+    }
+
+    if (!file) {
+      file = await createZipFile(zipfile, filesDir);
+    }
+    reply.send(file);
path: server/src/routes/user-routes.ts
user: login: paologum
body: this could probably be a lot less lines

like
```
if (await verifyFilepath(zipFile))
await readFile
else
await createZipFile()
```
created_at: 2025-03-31T19:18:58Z
author_association: CONTRIBUTOR
diff_hunk: @@ -382,6 +384,13 @@ const About: React.FC<AboutProps> = observer(({ datapack }) => {
       window.removeEventListener("beforeunload", handleBeforeUnload);
     };
   }, [state.datapackProfilePage.unsavedChanges]);
+
+  function downloadDatapackFiles() {
+    if (checkUserAllowedDownloadDatapack(state.user, datapack)) {
+      actions.fetchDatapackFilesForDownload(datapack.title, getDatapackOfficialOrUUID(datapack), datapack.isPublic);
+    }
path: app/src/DatapackProfile.tsx
user: login: paologum
body: can you push a warning that says you are not allowed to download this datapacks pdfs
created_at: 2025-03-31T19:20:07Z
author_association: CONTRIBUTOR
diff_hunk: @@ -527,4 +533,117 @@
     console.error(e);
     reply.status(500).send({ error: "Failed to delete history" });
   }
+}
+
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle || /[<>:"/\\|?*]/.test(datapackTitle)) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+
+  if (!datapackFolder.startsWith(datapacksFolder)) {
+    reply.status(400).send({ error: "Invalid datapack title" });
+    return;
+  }
+
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  let zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  if (!zipfile.startsWith(path.join(process.cwd(), directory))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  try {
+    let file;
+    try {
+      zipfile = fs.realpathSync(zipfile);
+      if (!zipfile.startsWith(process.cwd())) {
+        reply.status(500).send({ error: "Invalid directory path" });
+      }
+      file = await readFile(zipfile);
+    } catch (e) {
+      const error = e as NodeJS.ErrnoException;
+      if (error.code !== "ENOENT") {
+        reply.status(500).send({ error: "An error occurred: " + e });
+        return;
+      }
+    }
+
+    if (!file) {
+      file = await createZipFile(zipfile, filesDir);
+    }
+    reply.send(file);
+  } catch (e) {
+    const error = e as NodeJS.ErrnoException;
+    if (error.code === "ENOENT") {
+      reply.status(404).send({ error: "Failed to process the file" });
+    } else {
+      reply.status(500).send({ error: "An error occurred: " + e });
+    }
+  }
+}
+
+export const downloadDatapackFilesZip = async function downloadDatapackFilesZip(
+  request: FastifyRequest<{ Params: { datapackTitle: string; uuid: string; isPublic: boolean } }>,
+  reply: FastifyReply
+) {
+  const { datapackTitle, uuid, isPublic } = request.params;
+
+  if (!datapackTitle || /[<>:"/\\|?*]/.test(datapackTitle)) {
+    reply.status(400).send({ error: "Missing datapack title" });
+    return;
+  }
+
+  const directory = await getUserUUIDDirectory(uuid, isPublic);
+  const datapacksFolder = await getUsersDatapacksDirectoryFromUUIDDirectory(directory);
+  const datapackFolder = path.join(datapacksFolder, datapackTitle);
+
+  if (!datapackFolder.startsWith(datapacksFolder)) {
+    reply.status(400).send({ error: "Invalid datapack title" });
+    return;
+  }
+
+  const filesDir = await getPDFFilesDirectoryFromDatapackDirectory(datapackFolder);
+  if (!(await verifyFilepath(filesDir))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  const zipfile = path.resolve(directory, `filesFor${datapackTitle}.zip`); //could be non-existent
+  if (!(await verifyNonExistentFilepath(zipfile))) {
+    reply.status(500).send({ error: "Invalid directory path" });
+    return;
+  }
+  let file;
+
+  try {
+    if (await verifyFilepath(zipfile)) {
+      file = await readFile(zipfile);
path: server/src/routes/user-routes.ts
user: login: github-advanced-security[bot]
body: ## Uncontrolled data used in path expression

This path depends on a [user-provided value](1).

[Show more details](https://github.com/earthhistoryviz/tsconline/security/code-scanning/219)
created_at: 2025-04-02T18:51:32Z
author_association: NONE
path: server/assets/translation.xlsx
user: login: lbostre
body: merge conflict
created_at: 2025-04-02T19:00:44Z
author_association: CONTRIBUTOR
diff_hunk: @@ -375,6 +378,9 @@ export const adminUploadOfficialDatapack: UploadDatapackMethodType = action(
         if (!pack) {
           return;
         }
+        if (pdfFiles?.length) {
+          pack.hasFiles = true;
+        }
path: app/src/state/actions/admin-actions.ts
user: login: paologum
body: shouldn't the datapack have the `hasFiles` field set?
created_at: 2025-04-03T05:44:26Z
author_association: CONTRIBUTOR
diff_hunk: @@ -1302,6 +1303,8 @@ export function assertDatapackMetadata(o: any): asserts o is DatapackMetadata {
   if ("datapackImage" in o && typeof o.datapackImage !== "string")
     throwError("DatapackMetadata", "datapackImage", "string", o.datapackImage);
   if (typeof o.priority !== "number") throwError("DatapackMetadata", "priority", "number", o.priority);
+  if ("hasFiles" in o && typeof o.hasFiles !== "boolean")
+    throwError("DatapackMetadata", "hasFiles", "boolean", o.hasFiles);
path: shared/src/index.ts
user: login: paologum
body: it should always have `hasFiles` in the object
created_at: 2025-04-03T05:46:23Z
author_association: CONTRIBUTOR
path: server/src/routes/user-routes.ts
user: login: paologum
body: i didn't see this before, but i don't want to have to go back myself making these tests so add a test for this, it's not in coverage so it didn't popup unfortunately, also it will need to be added to that routes array
created_at: 2025-04-06T20:42:09Z
author_association: CONTRIBUTOR
path: server/__tests__/upload-datapack.test.ts
user: login: paologum
body: on main, i merged something that requires pdfFields to not have to be a required parameter jsyk
created_at: 2025-04-06T20:43:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -329,10 +370,14 @@ export const uploadUserDatapack = action(
           pushError(ErrorCodes.USER_FETCH_DATAPACK_FAILED);
           return;
         }
+        if (pdfFiles?.length) {
+          datapack.hasFiles = true;
+        }
path: app/src/state/actions/general-actions.ts
user: login: paologum
body: this shouldn't alter the datapack, it's field should be representative of what's on the server and the app, the app shouldn't make a change to it that would make it different than the server

if this is giving an incorrect value it should be changed properly on a datapack upload, not on a fetch
created_at: 2025-04-06T20:44:35Z
author_association: CONTRIBUTOR
diff_hunk: @@ -358,6 +358,9 @@ export const adminUploadOfficialDatapack: UploadDatapackMethodType = action(
       pdfFiles.forEach((pdfFile) => {
         formData.append("pdfFiles[]", pdfFile);
       });
+      formData.append("hasFiles", "true");
+    } else {
+      formData.append("hasFiles", "false");
path: app/src/state/actions/admin-actions.ts
user: login: paologum
body: if you already have the `hasFiles` logic written in the datapack metadata that you send in the form, you should use that instead of this. this is more robust obviously but if you decide to do it this way, there is no need to have the hook have the `hasFiles` variable. it should just be one or the other
created_at: 2025-04-06T20:46:52Z
author_association: CONTRIBUTOR
diff_hunk: @@ -329,10 +370,14 @@ export const uploadUserDatapack = action(
           pushError(ErrorCodes.USER_FETCH_DATAPACK_FAILED);
           return;
         }
+        if (pdfFiles?.length) {
+          datapack.hasFiles = true;
+        }
path: app/src/state/actions/general-actions.ts
user: login: paologum
body: same thing this code shouldn't be here why do you have this?
created_at: 2025-04-14T20:20:36Z
author_association: CONTRIBUTOR

PR comments:
user: login: github-actions[bot]
created_at: 2025-03-25T20:30:57Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [9d08b07](https://github.com/earthhistoryviz/tsconline/commit/9d08b07d3d0fe5f689b5e96ac14e8c9ac4e36dd9)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [9d08b07](https://github.com/earthhistoryviz/tsconline/commit/9d08b07d3d0fe5f689b5e96ac14e8c9ac4e36dd9)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [9d08b07](https://github.com/earthhistoryviz/tsconline/commit/9d08b07d3d0fe5f689b5e96ac14e8c9ac4e36dd9)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T20:31:37Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:981:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1031:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1068:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1109:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1111:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1117:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1143:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1151:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ❯ server/__tests__/upload-handlers.test.ts  (81 tests | 23 failed) 114ms
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if bytes are 0
     → expected 'Missing required fields' to be 'File is empty' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is a reserved word
     → expected 'Missing required fields' to be 'Invalid title' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if bytes is 0
     → expected 'Missing required fields' to be 'File is empty' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if incorrect datapack type
     → expected 'Missing required fields' to be 'Invalid datapack type' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { references: '[hi]' }
     → expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { tags: '[hi' }
     → expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { references: '{3' }
     → expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { tags: '[3"]' }
     → expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references is not a valid array
     → expected 'Missing required fields' to be 'References must be an array of strings' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags is not a valid array
     → expected 'Missing required fields' to be 'Tags must be an array of strings' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if date is not a valid date string
     → expected "spy" to be called with arguments: [ '12-12-2000' ]

Received: 



Number of calls: 0

   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if assertDatapackMetadata fails
     → expected 'Missing required fields' to be 'Invalid metadata received/processed' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a DatapackMetadata object on success
     → expected true to be false // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is too long
     → expected 'Missing required fields' to be 'Max title length is 100' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags array is too long
     → expected 'Missing required fields' to be 'Max tags allowed is 30' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a tag is too long
     → expected 'Missing required fields' to be 'Max tag length is 20' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if authored by length is too long
     → expected 'Missing required fields' to be 'Max authored by length is 200' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if description length is too long
     → expected 'Missing required fields' to be 'Max description length is 400' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long
     → expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long
     → expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references array is too long
     → expected 'Missing required fields' to be 'Max references allowed is 30' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a reference is too long
     → expected 'Missing required fields' to be 'Max references length is 100' // Object.is equality
   ❯ server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if contact length is too long
     → expected 'Missing required fields' to be 'Max contact length is 100' // Object.is equality
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 304ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 208ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 599ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 63ms
 ✓ server/__tests__/parse-datapacks.test.ts  (107 tests) 91ms
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 29ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 32ms
 ✓ server/__tests__/upload-datapack.test.ts  (18 tests) 11ms
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 14ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 11ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 143ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 9ms
 ✓ server/__tests__/util.test.ts  (19 tests) 8ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 57ms
 ✓ shared/__tests__/util.test.ts  (9 tests) 6ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 6983ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 10882ms

⎯⎯⎯⎯⎯⎯ Failed Tests 23 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if bytes are 0
AssertionError: expected 'Missing required fields' to be 'File is empty' // Object.is equality

- Expected
+ Received

- File is empty
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:155:25
    153|     assertOperationResult(val);
    154|     expect(val.code).toBe(400);
    155|     expect(val.message).toBe("File is empty");
       |                         ^
    156|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    157|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if bytes are 0,line=155,column=25::AssertionError: expected 'Missing required fields' to be 'File is empty' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- File is empty%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:155:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is a reserved word,line=181,column=25::AssertionError: expected 'Missing required fields' to be 'Invalid title' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Invalid title%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:181:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is a reserved word
AssertionError: expected 'Missing required fields' to be 'Invalid title' // Object.is equality

- Expected
+ Received

- Invalid title
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:181:25
    179|     assertOperationResult(val);
    180|     expect(val.code).toBe(400);
    181|     expect(val.message).toBe("Invalid title");
       |                         ^
    182|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    183|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if bytes is 0,line=197,column=25::AssertionError: expected 'Missing required fields' to be 'File is empty' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- File is empty%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:197:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if bytes is 0
AssertionError: expected 'Missing required fields' to be 'File is empty' // Object.is equality

- Expected
+ Received

- File is empty
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:197:25
    195|     assertOperationResult(val);
    196|     expect(val.code).toBe(400);
    197|     expect(val.message).toBe("File is empty");
       |                         ^
    198|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    199|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if incorrect datapack type,line=207,column=25::AssertionError: expected 'Missing required fields' to be 'Invalid datapack type' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Invalid datapack type%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:207:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %25p is not a valid JSON string { references%3A '[hi]' },line=217,column=27::AssertionError: expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- References and tags must be valid arrays%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:217:27%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return 400 if incorrect datapack type
AssertionError: expected 'Missing required fields' to be 'Invalid datapack type' // Object.is equality

- Expected
+ Received

- Invalid datapack type
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:207:25
    205|     assertOperationResult(val);
    206|     expect(val.code).toBe(400);
    207|     expect(val.message).toBe("Invalid datapack type");
       |                         ^
    208|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    209|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %25p is not a valid JSON string { tags%3A '[hi' },line=217,column=27::AssertionError: expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- References and tags must be valid arrays%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:217:27%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { references: '[hi]' }
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { tags: '[hi' }
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { references: '{3' }
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %p is not a valid JSON string { tags: '[3"]' }
AssertionError: expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality

- Expected
+ Received

- References and tags must be valid arrays
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:217:27
    215|       assertOperationResult(val);
    216|       expect(val.code).toBe(400);
    217|       expect(val.message).toBe("References and tags must be valid arra…
       |                           ^
    218|       expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true }…
    219|     }


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %25p is not a valid JSON string { references%3A '{3' },line=217,column=27::AssertionError: expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- References and tags must be valid arrays%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:217:27%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[5/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if %25p is not a valid JSON string { tags%3A '[3"]' },line=217,column=27::AssertionError: expected 'Missing required fields' to be 'References and tags must be valid arr…' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- References and tags must be valid arrays%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:217:27%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references is not a valid array
AssertionError: expected 'Missing required fields' to be 'References must be an array of strings' // Object.is equality

- Expected
+ Received

- References must be an array of strings
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:226:25
    224|     assertOperationResult(val);
    225|     expect(val.code).toBe(400);
    226|     expect(val.message).toBe("References must be an array of strings");
       |                         ^
    227|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    228|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references is not a valid array,line=226,column=25::AssertionError: expected 'Missing required fields' to be 'References must be an array of strings' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- References must be an array of strings%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:226:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[6/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags is not a valid array
AssertionError: expected 'Missing required fields' to be 'Tags must be an array of strings' // Object.is equality

- Expected
+ Received

- Tags must be an array of strings
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:234:25
    232|     assertOperationResult(val);
    233|     expect(val.code).toBe(400);
    234|     expect(val.message).toBe("Tags must be an array of strings");
       |                         ^
    235|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    236|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags is not a valid array,line=234,column=25::AssertionError: expected 'Missing required fields' to be 'Tags must be an array of strings' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Tags must be an array of strings%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:234:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[7/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if date is not a valid date string,line=240,column=25::AssertionError: expected "spy" to be called with arguments: [ '12-12-2000' ]%0A%0AReceived: %0A%0A%0A%0ANumber of calls: 0%0A%0A ❯ server/__tests__/upload-handlers.test.ts:240:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if date is not a valid date string
AssertionError: expected "spy" to be called with arguments: [ '12-12-2000' ]

Received: 



Number of calls: 0

 ❯ server/__tests__/upload-handlers.test.ts:240:25
    238|     isDateValid.mockReturnValueOnce(false);
    239|     const val = await uploadUserDatapackHandler(fields, 1);
    240|     expect(isDateValid).toHaveBeenCalledWith(fields.date);
       |                         ^
    241|     expect(isOperationResult(val)).toBe(true);
    242|     assertOperationResult(val);


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if assertDatapackMetadata fails,line=256,column=25::AssertionError: expected 'Missing required fields' to be 'Invalid metadata received/processed' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Invalid metadata received/processed%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:256:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[8/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if assertDatapackMetadata fails
AssertionError: expected 'Missing required fields' to be 'Invalid metadata received/processed' // Object.is equality

- Expected
+ Received

- Invalid metadata received/processed
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:256:25
    254|     assertOperationResult(val);
    255|     expect(val.code).toBe(400);
    256|     expect(val.message).toBe("Invalid metadata received/processed");
       |                         ^
    257|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    258|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a DatapackMetadata object on success,line=264,column=36::AssertionError: expected true to be false // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- false%0A+ true%0A%0A ❯ server/__tests__/upload-handlers.test.ts:264:36%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[9/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is too long,line=295,column=25::AssertionError: expected 'Missing required fields' to be 'Max title length is 100' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max title length is 100%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:295:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a DatapackMetadata object on success
AssertionError: expected true to be false // Object.is equality

- Expected
+ Received

- false
+ true

 ❯ server/__tests__/upload-handlers.test.ts:264:36
    262|       1
    263|     );
    264|     expect(isOperationResult(val)).toBe(false);
       |                                    ^
    265|     expect(val).toEqual({
    266|       originalFileName: fields.originalFileName,


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags array is too long,line=309,column=25::AssertionError: expected 'Missing required fields' to be 'Max tags allowed is 30' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max tags allowed is 30%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:309:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[10/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if title is too long
AssertionError: expected 'Missing required fields' to be 'Max title length is 100' // Object.is equality

- Expected
+ Received

- Max title length is 100
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:295:25
    293|     assertOperationResult(val);
    294|     expect(val.code).toBe(400);
    295|     expect(val.message).toBe(`Max title length is ${shared.MAX_DATAPAC…
       |                         ^
    296|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    297|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a tag is too long,line=317,column=25::AssertionError: expected 'Missing required fields' to be 'Max tag length is 20' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max tag length is 20%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:317:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[11/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if authored by length is too long,line=332,column=25::AssertionError: expected 'Missing required fields' to be 'Max authored by length is 200' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max authored by length is 200%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:332:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if tags array is too long
AssertionError: expected 'Missing required fields' to be 'Max tags allowed is 30' // Object.is equality

- Expected
+ Received

- Max tags allowed is 30
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:309:25
    307|     assertOperationResult(val);
    308|     expect(val.code).toBe(400);
    309|     expect(val.message).toBe(`Max tags allowed is ${shared.MAX_DATAPAC…
       |                         ^
    310|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    311|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if description length is too long,line=347,column=25::AssertionError: expected 'Missing required fields' to be 'Max description length is 400' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max description length is 400%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:347:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[12/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a tag is too long
AssertionError: expected 'Missing required fields' to be 'Max tag length is 20' // Object.is equality

- Expected
+ Received

- Max tag length is 20
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:317:25
    315|     assertOperationResult(val);
    316|     expect(val.code).toBe(400);
    317|     expect(val.message).toBe(`Max tag length is ${shared.MAX_DATAPACK_…
       |                         ^
    318|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    319|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long,line=362,column=25::AssertionError: expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max notes length is 200%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:362:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[13/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long,line=377,column=25::AssertionError: expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max notes length is 200%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:377:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if authored by length is too long
AssertionError: expected 'Missing required fields' to be 'Max authored by length is 200' // Object.is equality

- Expected
+ Received

- Max authored by length is 200
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:332:25
    330|     assertOperationResult(val);
    331|     expect(val.code).toBe(400);
    332|     expect(val.message).toBe(`Max authored by length is ${shared.MAX_A…
       |                         ^
    333|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    334|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references array is too long,line=392,column=25::AssertionError: expected 'Missing required fields' to be 'Max references allowed is 30' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max references allowed is 30%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:392:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[14/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if description length is too long
AssertionError: expected 'Missing required fields' to be 'Max description length is 400' // Object.is equality

- Expected
+ Received

- Max description length is 400
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:347:25
    345|     assertOperationResult(val);
    346|     expect(val.code).toBe(400);
    347|     expect(val.message).toBe(`Max description length is ${shared.MAX_D…
       |                         ^
    348|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    349|   });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a reference is too long,line=407,column=25::AssertionError: expected 'Missing required fields' to be 'Max references length is 100' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max references length is 100%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:407:25%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[15/23]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts,title=server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if contact length is too long,line=421,column=25::AssertionError: expected 'Missing required fields' to be 'Max contact length is 100' // Object.is equality%0A%0A- Expected%0A+ Received%0A%0A- Max contact length is 100%0A+ Missing required fields%0A%0A ❯ server/__tests__/upload-handlers.test.ts:421:25%0A%0A
 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long
AssertionError: expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality

- Expected
+ Received

- Max notes length is 200
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:362:25
    360|     assertOperationResult(val);
    361|     expect(val.code).toBe(400);
    362|     expect(val.message).toBe(`Max notes length is ${shared.MAX_DATAPAC…
       |                         ^
    363|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    364|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[16/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if notes length is too long
AssertionError: expected 'Missing required fields' to be 'Max notes length is 200' // Object.is equality

- Expected
+ Received

- Max notes length is 200
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:377:25
    375|     assertOperationResult(val);
    376|     expect(val.code).toBe(400);
    377|     expect(val.message).toBe(`Max notes length is ${shared.MAX_DATAPAC…
       |                         ^
    378|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    379|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[17/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if references array is too long
AssertionError: expected 'Missing required fields' to be 'Max references allowed is 30' // Object.is equality

- Expected
+ Received

- Max references allowed is 30
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:392:25
    390|     assertOperationResult(val);
    391|     expect(val.code).toBe(400);
    392|     expect(val.message).toBe(`Max references allowed is ${shared.MAX_D…
       |                         ^
    393|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    394|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[18/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if a reference is too long
AssertionError: expected 'Missing required fields' to be 'Max references length is 100' // Object.is equality

- Expected
+ Received

- Max references length is 100
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:407:25
    405|     assertOperationResult(val);
    406|     expect(val.code).toBe(400);
    407|     expect(val.message).toBe(`Max references length is ${shared.MAX_DA…
       |                         ^
    408|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    409|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[19/23]⎯

 FAIL  server/__tests__/upload-handlers.test.ts > uploadUserDatapackHandler > should return a 400 error if contact length is too long
AssertionError: expected 'Missing required fields' to be 'Max contact length is 100' // Object.is equality

- Expected
+ Received

- Max contact length is 100
+ Missing required fields

 ❯ server/__tests__/upload-handlers.test.ts:421:25
    419|     assertOperationResult(val);
    420|     expect(val.code).toBe(400);
    421|     expect(val.message).toBe(`Max contact length is ${shared.MAX_DATAP…
       |                         ^
    422|     expect(rm).toHaveBeenCalledWith(fields.filepath, { force: true });
    423|   });

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[20/23]⎯

 Test Files  1 failed | 17 passed (18)
      Tests  23 failed | 943 passed (966)
   Start at  20:31:12
   Duration  19.42s (transform 1.50s, setup 1ms, collect 13.68s, tests 19.56s, environment 5ms, prepare 5.49s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T21:12:24Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [c052aa7](https://github.com/earthhistoryviz/tsconline/commit/c052aa71a3a9f4317bae6c48cb91cece7d9d96a4)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [c052aa7](https://github.com/earthhistoryviz/tsconline/commit/c052aa71a3a9f4317bae6c48cb91cece7d9d96a4)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [c052aa7](https://github.com/earthhistoryviz/tsconline/commit/c052aa71a3a9f4317bae6c48cb91cece7d9d96a4)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-25T21:18:44Z
body: 
## :x: Coverage Thresholds Not Met

The following coverage thresholds were not met:

```
ERROR: Coverage for lines (75%) does not meet "shared/src/util.ts" threshold (90%)
ERROR: Coverage for functions (66.66%) does not meet "shared/src/util.ts" threshold (90%)
ERROR: Coverage for statements (75%) does not meet "shared/src/util.ts" threshold (90%)
```

Please review the coverage report and improve the tests to meet the thresholds.

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:01:25Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/shared/src/util.ts
  1:10  error  'Datapack' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:01:32Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:01:43Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/shared/src/util.ts
  1:10  error  'Datapack' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:01:50Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:02:34Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [29ab1f6](https://github.com/earthhistoryviz/tsconline/commit/29ab1f6a221d9762da68778296635f671f42cb8d)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [29ab1f6](https://github.com/earthhistoryviz/tsconline/commit/29ab1f6a221d9762da68778296635f671f42cb8d)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [29ab1f6](https://github.com/earthhistoryviz/tsconline/commit/29ab1f6a221d9762da68778296635f671f42cb8d)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:02:49Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [2405d42](https://github.com/earthhistoryviz/tsconline/commit/2405d420d649fc795f869d53f5c39596c04e3c5f)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [2405d42](https://github.com/earthhistoryviz/tsconline/commit/2405d420d649fc795f869d53f5c39596c04e3c5f)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [2405d42](https://github.com/earthhistoryviz/tsconline/commit/2405d420d649fc795f869d53f5c39596c04e3c5f)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:03:23Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/shared/src/util.ts
  1:10  error  'Datapack' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:03:25Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/shared/src/util.ts
  1:10  error  'Datapack' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:03:26Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 98ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 322ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 207ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 559ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 62ms
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 34ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 190ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 34ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 29ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 15ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 11ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 154ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 6ms
 ✓ server/__tests__/util.test.ts  (19 tests) 8ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 42ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 6ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 7412ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11656ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:02:59
   Duration  20.27s (transform 1.50s, setup 2ms, collect 13.63s, tests 20.84s, environment 5ms, prepare 5.45s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:03:44Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 129ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 308ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 200ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 588ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 61ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 170ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 27ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 30ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 32ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 15ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 12ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 149ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 6ms
 ✓ server/__tests__/util.test.ts  (19 tests) 9ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 57ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 6ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 7815ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11629ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:03:18
   Duration  20.34s (transform 1.64s, setup 3ms, collect 14.18s, tests 21.24s, environment 5ms, prepare 5.06s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:04:30Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:04:36Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [b3146e0](https://github.com/earthhistoryviz/tsconline/commit/b3146e0e5d775749e4436960d136a834c8d36cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:05:01Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:05:03Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 440 to line 440
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [4b59c29](https://github.com/earthhistoryviz/tsconline/commit/4b59c29f2f3758bedca79f2d428b7b589f8b9f15)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:05:20Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 135ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 313ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 194ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 615ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 53ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 162ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 31ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 34ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 35ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 20ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 12ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 132ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 7ms
 ✓ server/__tests__/util.test.ts  (19 tests) 11ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 43ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 6ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 8408ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11858ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:04:54
   Duration  20.50s (transform 1.69s, setup 0ms, collect 14.06s, tests 22.07s, environment 5ms, prepare 5.34s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:05:26Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 112ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 290ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 199ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 617ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 58ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 165ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 33ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 32ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 31ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 25ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 9ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 141ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 7ms
 ✓ server/__tests__/util.test.ts  (19 tests) 8ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 68ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 6ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 7307ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11107ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:05:01
   Duration  19.61s (transform 1.80s, setup 2ms, collect 13.93s, tests 20.21s, environment 5ms, prepare 5.15s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:05:55Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 132ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 361ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 197ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 612ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 58ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 175ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 33ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 41ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 27ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 16ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 12ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 162ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 7ms
 ✓ server/__tests__/util.test.ts  (19 tests) 24ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 48ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 11ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 6643ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 10787ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:05:29
   Duration  19.78s (transform 1.68s, setup 2ms, collect 14.44s, tests 19.35s, environment 5ms, prepare 5.53s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:06:41Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

stderr | server/__tests__/upload-handlers.test.ts > uploadFilesToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadFilesToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:502:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:984:12

stderr | server/__tests__/upload-handlers.test.ts > uploadCoverToWorkshop tests > should return 500 if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.uploadCoverPicToWorkshop (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:531:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1034:12

stderr | server/__tests__/upload-handlers.test.ts > fetchWorkshopCoverPictureFilepath tests > should return null if path is invalid
Error: Invalid Workshop Cover Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:81:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.fetchWorkshopCoverPictureFilepath (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:561:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1071:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if path is invalid
Error: error
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1112:13)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopDatapacksNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:587:32)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1114:12
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:11)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopDatapacksNames tests > should return empty array if fail to read dir
Error reading directory uuid-directory: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1120:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if path is invalid
Error: Invalid Workshop Files Directory.
    at Proxy.<anonymous> (/home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:84:11)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Proxy.mockCall (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-spy-npm-1.6.1-2d61a7a0f0-55076c8dad.zip/node_modules/@vitest/spy/dist/index.js:50:17)
    at Proxy.spy (file:///home/runner/work/tsconline/tsconline/.yarn/cache/tinyspy-npm-2.2.1-1079b8de54-170d6232e8.zip/node_modules/tinyspy/dist/index.js:42:80)
    at Module.getWorkshopFilesNames (/home/runner/work/tsconline/tsconline/server/src/upload-handlers.ts:612:25)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1146:12

stderr | server/__tests__/upload-handlers.test.ts > getWorkshopFilesNames tests > should return empty array if fail to read dir
Error reading directory workshop-uuid/files: Error: error
    at /home/runner/work/tsconline/tsconline/server/__tests__/upload-handlers.test.ts:1154:35
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:135:14
    at file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:60:26
    at runTest (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:781:17)
    at processTicksAndRejections (node:internal/process/task_queues:95:5)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runSuite (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:909:15)
    at runFiles (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:958:5)
    at startTests (file:///home/runner/work/tsconline/tsconline/.yarn/cache/@vitest-runner-npm-1.6.1-4c47e70627-b3ee2cb7b8.zip/node_modules/@vitest/runner/dist/index.js:967:3)
    at file:///home/runner/work/tsconline/tsconline/.yarn/__virtual__/vitest-virtual-645c8fb53d/0/cache/vitest-npm-1.6.1-d33201e97b-50d551be2c.zip/node_modules/vitest/dist/chunks/runtime-runBaseTests.oAvMKtQC.js:116:7

 ✓ server/__tests__/upload-handlers.test.ts  (82 tests) 115ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 410ms
 ✓ server/__tests__/user-routes.test.ts  (77 tests) 219ms
 ✓ server/__tests__/admin-routes.test.ts  (277 tests) 598ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 60ms
 ❯ server/__tests__/parse-datapacks.test.ts  (107 tests | 3 failed) 160ms
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
     → expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }
   ❯ server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
     → expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 34ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 31ms
 ❯ server/__tests__/upload-datapack.test.ts  (18 tests | 1 failed) 37ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(5) } to deeply equal { …(4) }
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 19ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 10ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 160ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 7ms
 ✓ server/__tests__/util.test.ts  (19 tests) 13ms
 ✓ server/__tests__/crossplot-routes.test.ts  (5 tests) 67ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 9ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (7 tests) 6603ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11111ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 4 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Nigeria Coast",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Delta",
                      "rockType": "Sandstone",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "ProDelta",
                      "rockType": "Claystone",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Members",
                  "on": false,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Facies Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Nigeria Coast Series Label",
                  "on": true,
                  "parent": "Nigeria Coast",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Nigeria Coast",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Nigeria Coast",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Delta",
                  "rockType": "Sandstone",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "ProDelta",
                  "rockType": "Claystone",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "South Atlantic",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Deep marine",
                      "rockType": "Shallow-marine marl",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Ocean crust",
                      "rockType": "Lava",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Members",
                  "on": false,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Facies Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "South Atlantic Series Label",
                  "on": true,
                  "parent": "South Atlantic",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "South Atlantic",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "South Atlantic",
              "on": true,
              "parent": "Central Africa Cenozoic",
              "popup": "",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Deep marine",
                  "rockType": "Shallow-marine marl",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Ocean crust",
                  "rockType": "Lava",
                },
              ],
              "units": "Ma",
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Central Africa Cenozoic",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Uncertainty Label",
            "Zone Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 10,
          "minAge": 0,
          "name": "Central Africa Cenozoic",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Delta",
              "rockType": "Sandstone",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "ProDelta",
              "rockType": "Claystone",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Uncertainty Label",
        "Zone Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 10,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 0,
      "Event": 0,
      "Facies": 2,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "Africa Bight Map",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "AfricaBight.map",
    "priority": 0,
    "references": Array [],
    "size": "200.98 KB",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Africa Bight",
    "totalColumns": 8,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:85:23
     83|       "parse-datapacks-test-1.txt"
     84|     );
     85|     expect(datapacks).toEqual(key["general-parse-datapacks-test-1-key"…
       |                       ^
     86|   });
     87| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse africa general datapack,line=85,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Nigeria Coast",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Delta",%0A                      "rockType": "Sandstone",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "ProDelta",%0A                      "rockType": "Claystone",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Members",%0A                  "on": false,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Facies Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Nigeria Coast Series Label",%0A                  "on": true,%0A                  "parent": "Nigeria Coast",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Nigeria Coast",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Nigeria Coast",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Delta",%0A                  "rockType": "Sandstone",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "ProDelta",%0A                  "rockType": "Claystone",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "South Atlantic",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Deep marine",%0A                      "rockType": "Shallow-marine marl",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Ocean crust",%0A                      "rockType": "Lava",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Members",%0A                  "on": false,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Facies Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "South Atlantic Series Label",%0A                  "on": true,%0A                  "parent": "South Atlantic",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "South Atlantic",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "South Atlantic",%0A              "on": true,%0A              "parent": "Central Africa Cenozoic",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Deep marine",%0A                  "rockType": "Shallow-marine marl",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Ocean crust",%0A                  "rockType": "Lava",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Central Africa Cenozoic",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Uncertainty Label",%0A            "Zone Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 10,%0A          "minAge": 0,%0A          "name": "Central Africa Cenozoic",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Delta",%0A              "rockType": "Sandstone",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "ProDelta",%0A              "rockType": "Claystone",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Uncertainty Label",%0A        "Zone Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 10,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 2,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "Africa Bight Map",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "AfricaBight.map",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "200.98 KB",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Africa Bight",%0A    "totalColumns": 8,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:85:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/4]⎯


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types,line=94,column=23::AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "baseAge": 5,%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A        Object {%0A          "children": Array [%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Zone",%0A              "columnSpecificSettings": Object {%0A                "orientation": "normal",%0A              },%0A              "editName": "Block",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 433.35,%0A              "minAge": 419.2,%0A              "name": "Block",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Block Popup",%0A              "rgb": Object {%0A                "b": 234,%0A                "g": 217,%0A                "r": 197,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 419.2,%0A                  "label": "TOP",%0A                  "lineStyle": "solid",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A                Object {%0A                  "age": 433.35,%0A                  "label": "Block SubBlock",%0A                  "lineStyle": "solid",%0A                  "popup": "Block SubBlock Info",%0A                  "rgb": Object {%0A                    "b": 234,%0A                    "g": 217,%0A                    "r": 197,%0A                  },%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 120,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Facies",%0A                  "editName": "Facies",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Uncertainty Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "showUncertaintyLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "info": "",%0A                      "rockType": "TOP",%0A                    },%0A                    Object {%0A                      "age": 5,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 1 Label",%0A                      "rockType": "Facies SubFaciesInfo 1",%0A                    },%0A                    Object {%0A                      "age": 10,%0A                      "info": "",%0A                      "label": "Facies SubFaciesInfo 2 Label",%0A                      "rockType": "Facies SubFaciesInfo 2",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Members",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Members",%0A                  "on": false,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 210,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Facies Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Facies Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 84,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 10,%0A                  "minAge": 0,%0A                  "name": "Facies Series Label",%0A                  "on": true,%0A                  "parent": "Facies",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 200,%0A                    "r": 100,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 42,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Facies",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Uncertainty Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 10,%0A              "minAge": 0,%0A              "name": "Facies",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Facies Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "info": "",%0A                  "rockType": "TOP",%0A                },%0A                Object {%0A                  "age": 5,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 1 Label",%0A                  "rockType": "Facies SubFaciesInfo 1",%0A                },%0A                Object {%0A                  "age": 10,%0A                  "info": "",%0A                  "label": "Facies SubFaciesInfo 2 Label",%0A                  "rockType": "Facies SubFaciesInfo 2",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Event",%0A              "columnSpecificSettings": Object {%0A                "drawDualColCompColumn": null,%0A                "dualColCompColumnRef": null,%0A                "frequency": null,%0A                "rangeSort": "first occurrence",%0A                "stepSize": 1,%0A                "type": "events",%0A                "windowSize": 2,%0A              },%0A              "editName": "Event",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Event Column Label",%0A                "Uncertainty Label",%0A                "Range Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.4,%0A              "minAge": 0.02,%0A              "name": "Event",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Event Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 200,%0A                "r": 100,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "showUncertaintyLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0.02,%0A                  "label": "SubEventInfo 1",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 1",%0A                  "subEventType": "EVENT",%0A                },%0A                Object {%0A                  "age": 0.4,%0A                  "label": "SubEventInfo 2",%0A                  "lineStyle": "solid",%0A                  "popup": "Event SubEventInfo Popup 2",%0A                  "subEventType": "EVENT",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 250,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Range",%0A              "columnSpecificSettings": Object {%0A                "agePad": 2,%0A                "margin": 0.2,%0A                "rangeSort": "first occurrence",%0A              },%0A              "editName": "Range",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Popup Body",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 100,%0A              "minAge": 10,%0A              "name": "Range",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Range Popup",%0A              "rgb": Object {%0A                "b": 174,%0A                "g": 207,%0A                "r": 198,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "abundance": "TOP",%0A                  "age": 10,%0A                  "label": "SubRangeInfo 1",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "abundance": "rare",%0A                  "age": 100,%0A                  "label": "SubRangeInfo 2",%0A                  "popup": "Range SubRangeInfo Popup 2",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Chron",%0A                  "columnSpecificSettings": Object {%0A                    "dataMiningChronDataType": null,%0A                    "stepSize": 1,%0A                    "windowSize": 2,%0A                  },%0A                  "editName": "Chron",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "subInfo": Array [%0A                    Object {%0A                      "age": 0,%0A                      "polarity": "TOP",%0A                      "popup": "",%0A                    },%0A                    Object {%0A                      "age": 0.123,%0A                      "label": "SubChronInfo 1 Label",%0A                      "polarity": "N",%0A                      "popup": "SubChronInfo 1 Popup",%0A                    },%0A                    Object {%0A                      "age": 0.234,%0A                      "label": "SubChronInfo 2 Label",%0A                      "polarity": "R",%0A                      "popup": "SubChronInfo 2 Popup",%0A                    },%0A                  ],%0A                  "units": "Ma",%0A                  "width": 60,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "normal",%0A                  },%0A                  "editName": "Chron Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Chron Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A                Object {%0A                  "children": Array [],%0A                  "columnDisplayType": "Zone",%0A                  "columnSpecificSettings": Object {%0A                    "orientation": "vertical",%0A                  },%0A                  "editName": "Series Label",%0A                  "enableTitle": false,%0A                  "expanded": false,%0A                  "fontOptions": Array [%0A                    "Column Header",%0A                    "Age Label",%0A                    "Zone Column Label",%0A                  ],%0A                  "fontsInfo": Object {%0A                    "font": "Arial",%0A                  },%0A                  "maxAge": 0.234,%0A                  "minAge": 0,%0A                  "name": "Chron Series Label",%0A                  "on": true,%0A                  "parent": "Chron",%0A                  "popup": "",%0A                  "rgb": Object {%0A                    "b": 255,%0A                    "g": 255,%0A                    "r": 255,%0A                  },%0A                  "show": true,%0A                  "showAgeLabels": false,%0A                  "units": "Ma",%0A                  "width": 40,%0A                },%0A              ],%0A              "columnDisplayType": "BlockSeriesMetaColumn",%0A              "editName": "Chron",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Zone Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 0.234,%0A              "minAge": 0,%0A              "name": "Chron",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Chron Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "polarity": "TOP",%0A                  "popup": "",%0A                },%0A                Object {%0A                  "age": 0.123,%0A                  "label": "SubChronInfo 1 Label",%0A                  "polarity": "N",%0A                  "popup": "SubChronInfo 1 Popup",%0A                },%0A                Object {%0A                  "age": 0.234,%0A                  "label": "SubChronInfo 2 Label",%0A                  "polarity": "R",%0A                  "popup": "SubChronInfo 2 Popup",%0A                },%0A              ],%0A              "units": "Ma",%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Point",%0A              "columnSpecificSettings": Object {%0A                "backgroundGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "backgroundGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "curveGradientEnd": Object {%0A                  "b": 255,%0A                  "g": 255,%0A                  "r": 255,%0A                },%0A                "curveGradientStart": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "dataMiningPointDataType": null,%0A                "drawBackgroundGradient": false,%0A                "drawCurveGradient": false,%0A                "drawDualColCompColumn": null,%0A                "drawFill": true,%0A                "drawLine": true,%0A                "drawScale": true,%0A                "dualColCompColumnRef": null,%0A                "fill": Object {%0A                  "b": 191,%0A                  "g": 233,%0A                  "r": 64,%0A                },%0A                "flipScale": false,%0A                "isDataMiningColumn": false,%0A                "lineColor": Object {%0A                  "b": 0,%0A                  "g": 0,%0A                  "r": 0,%0A                },%0A                "lowerRange": 0,%0A                "maxX": 9,%0A                "minX": 0,%0A                "pointShape": "nopoints",%0A                "scaleStart": 0,%0A                "scaleStep": 1,%0A                "smoothed": true,%0A                "stepSize": 1,%0A                "upperRange": 10,%0A                "windowSize": 2,%0A              },%0A              "editName": "Point",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Point Column Scale Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5,%0A              "minAge": 4,%0A              "name": "Point",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Point Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 4,%0A                  "popup": "SubPointInfo Popup 1",%0A                  "xVal": 0,%0A                },%0A                Object {%0A                  "age": 5,%0A                  "popup": "SubPointInfo Popup 2",%0A                  "xVal": 9,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 100,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Sequence",%0A              "columnSpecificSettings": Object {%0A                "drawNameLabel": true,%0A                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",%0A                "labelMarginLeft": 5,%0A                "labelMarginRight": 5,%0A                "type": "sequence",%0A              },%0A              "editName": "Sequence",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A                "Age Label",%0A                "Sequence Column Label",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 2,%0A              "minAge": 0,%0A              "name": "Sequence",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Sequence Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 255,%0A              },%0A              "show": true,%0A              "showAgeLabels": false,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                  "direction": "MFS",%0A                  "popup": "No Label Popup",%0A                  "severity": "Major",%0A                },%0A                Object {%0A                  "age": 2,%0A                  "direction": "SB",%0A                  "label": "Label 1",%0A                  "popup": "Label 1 Popup",%0A                  "severity": "Medium",%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 900,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Freehand",%0A              "editName": "Freehand",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 1.3,%0A              "minAge": 0,%0A              "name": "Freehand",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "",%0A              "rgb": Object {%0A                "b": 104,%0A                "g": 123,%0A                "r": 227,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "baseAge": 1,%0A                  "topAge": 0,%0A                },%0A                Object {%0A                  "baseAge": 1.3,%0A                  "topAge": 0.3,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 70,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Blank",%0A              "editName": "Blank",%0A              "enableTitle": false,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 5e-324,%0A              "minAge": 1.7976931348623157e+308,%0A              "name": "Blank",%0A              "on": false,%0A              "parent": "Parent 1",%0A              "popup": "Blank Popup",%0A              "rgb": Object {%0A                "b": 4,%0A                "g": 3,%0A                "r": 7,%0A              },%0A              "show": true,%0A              "units": "Ma",%0A              "width": 800,%0A            },%0A            Object {%0A              "children": Array [],%0A              "columnDisplayType": "Transect",%0A              "editName": "Transect",%0A              "enableTitle": true,%0A              "expanded": false,%0A              "fontOptions": Array [%0A                "Column Header",%0A              ],%0A              "fontsInfo": Object {%0A                "font": "Arial",%0A              },%0A              "maxAge": 9.22,%0A              "minAge": 0,%0A              "name": "Transect",%0A              "on": true,%0A              "parent": "Parent 1",%0A              "popup": "Transect Popup",%0A              "rgb": Object {%0A                "b": 255,%0A                "g": 255,%0A                "r": 240,%0A              },%0A              "show": true,%0A              "subInfo": Array [%0A                Object {%0A                  "age": 0,%0A                },%0A                Object {%0A                  "age": 2.58,%0A                },%0A                Object {%0A                  "age": 9.22,%0A                },%0A              ],%0A              "units": "Ma",%0A              "width": 500,%0A            },%0A          ],%0A          "columnDisplayType": "MetaColumn",%0A          "editName": "Parent 1",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Age Label",%0A            "Zone Column Label",%0A            "Uncertainty Label",%0A            "Event Column Label",%0A            "Range Label",%0A            "Popup Body",%0A            "Point Column Scale Label",%0A            "Sequence Column Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 433.35,%0A          "minAge": 0,%0A          "name": "Parent 1",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "subInfo": Array [%0A            Object {%0A              "age": 0,%0A              "info": "",%0A              "rockType": "TOP",%0A            },%0A            Object {%0A              "age": 5,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 1 Label",%0A              "rockType": "Facies SubFaciesInfo 1",%0A            },%0A            Object {%0A              "age": 10,%0A              "info": "",%0A              "label": "Facies SubFaciesInfo 2 Label",%0A              "rockType": "Facies SubFaciesInfo 2",%0A            },%0A          ],%0A          "units": "Ma",%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A        "Age Label",%0A        "Zone Column Label",%0A        "Uncertainty Label",%0A        "Event Column Label",%0A        "Range Label",%0A        "Popup Body",%0A        "Point Column Scale Label",%0A        "Sequence Column Label",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": 433.35,%0A      "minAge": 0,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 6,%0A      "Chron": 1,%0A      "Event": 1,%0A      "Facies": 1,%0A      "Freehand": 1,%0A      "Point": 1,%0A      "Range": 1,%0A      "Sequence": 1,%0A      "Transect": 1,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "date": "2015-03-15",%0A    "defaultChronostrat": "USGS",%0A    "description": "description",%0A    "formatVersion": 1,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "topAge": 0,%0A    "totalColumns": 14,%0A    "type": "official",%0A    "verticalScale": 6,%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:94:23%0A%0A
 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should parse general datapack with all column types
AssertionError: expected { columnInfo: { …(17) }, …(24) } to deeply equal { columnInfo: { …(17) }, …(23) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "baseAge": 5,
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
        Object {
          "children": Array [
            Object {
              "children": Array [],
              "columnDisplayType": "Zone",
              "columnSpecificSettings": Object {
                "orientation": "normal",
              },
              "editName": "Block",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 433.35,
              "minAge": 419.2,
              "name": "Block",
              "on": false,
              "parent": "Parent 1",
              "popup": "Block Popup",
              "rgb": Object {
                "b": 234,
                "g": 217,
                "r": 197,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 419.2,
                  "label": "TOP",
                  "lineStyle": "solid",
                  "popup": "",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
                Object {
                  "age": 433.35,
                  "label": "Block SubBlock",
                  "lineStyle": "solid",
                  "popup": "Block SubBlock Info",
                  "rgb": Object {
                    "b": 234,
                    "g": 217,
                    "r": 197,
                  },
                },
              ],
              "units": "Ma",
              "width": 120,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Facies",
                  "editName": "Facies",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Uncertainty Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "showUncertaintyLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "info": "",
                      "rockType": "TOP",
                    },
                    Object {
                      "age": 5,
                      "info": "",
                      "label": "Facies SubFaciesInfo 1 Label",
                      "rockType": "Facies SubFaciesInfo 1",
                    },
                    Object {
                      "age": 10,
                      "info": "",
                      "label": "Facies SubFaciesInfo 2 Label",
                      "rockType": "Facies SubFaciesInfo 2",
                    },
                  ],
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Members",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Members",
                  "on": false,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 210,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Facies Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Facies Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 84,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 10,
                  "minAge": 0,
                  "name": "Facies Series Label",
                  "on": true,
                  "parent": "Facies",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 200,
                    "r": 100,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 42,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Facies",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Uncertainty Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 10,
              "minAge": 0,
              "name": "Facies",
              "on": false,
              "parent": "Parent 1",
              "popup": "Facies Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "info": "",
                  "rockType": "TOP",
                },
                Object {
                  "age": 5,
                  "info": "",
                  "label": "Facies SubFaciesInfo 1 Label",
                  "rockType": "Facies SubFaciesInfo 1",
                },
                Object {
                  "age": 10,
                  "info": "",
                  "label": "Facies SubFaciesInfo 2 Label",
                  "rockType": "Facies SubFaciesInfo 2",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Event",
              "columnSpecificSettings": Object {
                "drawDualColCompColumn": null,
                "dualColCompColumnRef": null,
                "frequency": null,
                "rangeSort": "first occurrence",
                "stepSize": 1,
                "type": "events",
                "windowSize": 2,
              },
              "editName": "Event",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Event Column Label",
                "Uncertainty Label",
                "Range Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.4,
              "minAge": 0.02,
              "name": "Event",
              "on": true,
              "parent": "Parent 1",
              "popup": "Event Popup",
              "rgb": Object {
                "b": 255,
                "g": 200,
                "r": 100,
              },
              "show": true,
              "showAgeLabels": false,
              "showUncertaintyLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0.02,
                  "label": "SubEventInfo 1",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 1",
                  "subEventType": "EVENT",
                },
                Object {
                  "age": 0.4,
                  "label": "SubEventInfo 2",
                  "lineStyle": "solid",
                  "popup": "Event SubEventInfo Popup 2",
                  "subEventType": "EVENT",
                },
              ],
              "units": "Ma",
              "width": 250,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Range",
              "columnSpecificSettings": Object {
                "agePad": 2,
                "margin": 0.2,
                "rangeSort": "first occurrence",
              },
              "editName": "Range",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Popup Body",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 100,
              "minAge": 10,
              "name": "Range",
              "on": true,
              "parent": "Parent 1",
              "popup": "Range Popup",
              "rgb": Object {
                "b": 174,
                "g": 207,
                "r": 198,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "abundance": "TOP",
                  "age": 10,
                  "label": "SubRangeInfo 1",
                  "popup": "",
                },
                Object {
                  "abundance": "rare",
                  "age": 100,
                  "label": "SubRangeInfo 2",
                  "popup": "Range SubRangeInfo Popup 2",
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [
                Object {
                  "children": Array [],
                  "columnDisplayType": "Chron",
                  "columnSpecificSettings": Object {
                    "dataMiningChronDataType": null,
                    "stepSize": 1,
                    "windowSize": 2,
                  },
                  "editName": "Chron",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "subInfo": Array [
                    Object {
                      "age": 0,
                      "polarity": "TOP",
                      "popup": "",
                    },
                    Object {
                      "age": 0.123,
                      "label": "SubChronInfo 1 Label",
                      "polarity": "N",
                      "popup": "SubChronInfo 1 Popup",
                    },
                    Object {
                      "age": 0.234,
                      "label": "SubChronInfo 2 Label",
                      "polarity": "R",
                      "popup": "SubChronInfo 2 Popup",
                    },
                  ],
                  "units": "Ma",
                  "width": 60,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "normal",
                  },
                  "editName": "Chron Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Chron Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
                Object {
                  "children": Array [],
                  "columnDisplayType": "Zone",
                  "columnSpecificSettings": Object {
                    "orientation": "vertical",
                  },
                  "editName": "Series Label",
                  "enableTitle": false,
                  "expanded": false,
                  "fontOptions": Array [
                    "Column Header",
                    "Age Label",
                    "Zone Column Label",
                  ],
                  "fontsInfo": Object {
                    "font": "Arial",
                  },
                  "maxAge": 0.234,
                  "minAge": 0,
                  "name": "Chron Series Label",
                  "on": true,
                  "parent": "Chron",
                  "popup": "",
                  "rgb": Object {
                    "b": 255,
                    "g": 255,
                    "r": 255,
                  },
                  "show": true,
                  "showAgeLabels": false,
                  "units": "Ma",
                  "width": 40,
                },
              ],
              "columnDisplayType": "BlockSeriesMetaColumn",
              "editName": "Chron",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Zone Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 0.234,
              "minAge": 0,
              "name": "Chron",
              "on": true,
              "parent": "Parent 1",
              "popup": "Chron Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "polarity": "TOP",
                  "popup": "",
                },
                Object {
                  "age": 0.123,
                  "label": "SubChronInfo 1 Label",
                  "polarity": "N",
                  "popup": "SubChronInfo 1 Popup",
                },
                Object {
                  "age": 0.234,
                  "label": "SubChronInfo 2 Label",
                  "polarity": "R",
                  "popup": "SubChronInfo 2 Popup",
                },
              ],
              "units": "Ma",
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Point",
              "columnSpecificSettings": Object {
                "backgroundGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "backgroundGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "curveGradientEnd": Object {
                  "b": 255,
                  "g": 255,
                  "r": 255,
                },
                "curveGradientStart": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "dataMiningPointDataType": null,
                "drawBackgroundGradient": false,
                "drawCurveGradient": false,
                "drawDualColCompColumn": null,
                "drawFill": true,
                "drawLine": true,
                "drawScale": true,
                "dualColCompColumnRef": null,
                "fill": Object {
                  "b": 191,
                  "g": 233,
                  "r": 64,
                },
                "flipScale": false,
                "isDataMiningColumn": false,
                "lineColor": Object {
                  "b": 0,
                  "g": 0,
                  "r": 0,
                },
                "lowerRange": 0,
                "maxX": 9,
                "minX": 0,
                "pointShape": "nopoints",
                "scaleStart": 0,
                "scaleStep": 1,
                "smoothed": true,
                "stepSize": 1,
                "upperRange": 10,
                "windowSize": 2,
              },
              "editName": "Point",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Point Column Scale Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5,
              "minAge": 4,
              "name": "Point",
              "on": false,
              "parent": "Parent 1",
              "popup": "Point Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 4,
                  "popup": "SubPointInfo Popup 1",
                  "xVal": 0,
                },
                Object {
                  "age": 5,
                  "popup": "SubPointInfo Popup 2",
                  "xVal": 9,
                },
              ],
              "units": "Ma",
              "width": 100,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Sequence",
              "columnSpecificSettings": Object {
                "drawNameLabel": true,
                "graphStyle": "stroke-width: 0; fill: rgb(64, 191, 233);",
                "labelMarginLeft": 5,
                "labelMarginRight": 5,
                "type": "sequence",
              },
              "editName": "Sequence",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
                "Age Label",
                "Sequence Column Label",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 2,
              "minAge": 0,
              "name": "Sequence",
              "on": true,
              "parent": "Parent 1",
              "popup": "Sequence Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 255,
              },
              "show": true,
              "showAgeLabels": false,
              "subInfo": Array [
                Object {
                  "age": 0,
                  "direction": "MFS",
                  "popup": "No Label Popup",
                  "severity": "Major",
                },
                Object {
                  "age": 2,
                  "direction": "SB",
                  "label": "Label 1",
                  "popup": "Label 1 Popup",
                  "severity": "Medium",
                },
              ],
              "units": "Ma",
              "width": 900,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Freehand",
              "editName": "Freehand",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 1.3,
              "minAge": 0,
              "name": "Freehand",
              "on": true,
              "parent": "Parent 1",
              "popup": "",
              "rgb": Object {
                "b": 104,
                "g": 123,
                "r": 227,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "baseAge": 1,
                  "topAge": 0,
                },
                Object {
                  "baseAge": 1.3,
                  "topAge": 0.3,
                },
              ],
              "units": "Ma",
              "width": 70,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Blank",
              "editName": "Blank",
              "enableTitle": false,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 5e-324,
              "minAge": 1.7976931348623157e+308,
              "name": "Blank",
              "on": false,
              "parent": "Parent 1",
              "popup": "Blank Popup",
              "rgb": Object {
                "b": 4,
                "g": 3,
                "r": 7,
              },
              "show": true,
              "units": "Ma",
              "width": 800,
            },
            Object {
              "children": Array [],
              "columnDisplayType": "Transect",
              "editName": "Transect",
              "enableTitle": true,
              "expanded": false,
              "fontOptions": Array [
                "Column Header",
              ],
              "fontsInfo": Object {
                "font": "Arial",
              },
              "maxAge": 9.22,
              "minAge": 0,
              "name": "Transect",
              "on": true,
              "parent": "Parent 1",
              "popup": "Transect Popup",
              "rgb": Object {
                "b": 255,
                "g": 255,
                "r": 240,
              },
              "show": true,
              "subInfo": Array [
                Object {
                  "age": 0,
                },
                Object {
                  "age": 2.58,
                },
                Object {
                  "age": 9.22,
                },
              ],
              "units": "Ma",
              "width": 500,
            },
          ],
          "columnDisplayType": "MetaColumn",
          "editName": "Parent 1",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Age Label",
            "Zone Column Label",
            "Uncertainty Label",
            "Event Column Label",
            "Range Label",
            "Popup Body",
            "Point Column Scale Label",
            "Sequence Column Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 433.35,
          "minAge": 0,
          "name": "Parent 1",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "subInfo": Array [
            Object {
              "age": 0,
              "info": "",
              "rockType": "TOP",
            },
            Object {
              "age": 5,
              "info": "",
              "label": "Facies SubFaciesInfo 1 Label",
              "rockType": "Facies SubFaciesInfo 1",
            },
            Object {
              "age": 10,
              "info": "",
              "label": "Facies SubFaciesInfo 2 Label",
              "rockType": "Facies SubFaciesInfo 2",
            },
          ],
          "units": "Ma",
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
        "Age Label",
        "Zone Column Label",
        "Uncertainty Label",
        "Event Column Label",
        "Range Label",
        "Popup Body",
        "Point Column Scale Label",
        "Sequence Column Label",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": 433.35,
      "minAge": 0,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 6,
      "Chron": 1,
      "Event": 1,
      "Facies": 1,
      "Freehand": 1,
      "Point": 1,
      "Range": 1,
      "Sequence": 1,
      "Transect": 1,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "date": "2015-03-15",
    "defaultChronostrat": "USGS",
    "description": "description",
    "formatVersion": 1,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "topAge": 0,
    "totalColumns": 14,
    "type": "official",
    "verticalScale": 6,
  }

 ❯ server/__tests__/parse-datapacks.test.ts:94:23
     92|   it("should parse general datapack with all column types", async () =…
     93|     const datapacks = await parseDatapacks(datapack, "parse-datapacks-…
     94|     expect(datapacks).toEqual(key["general-parse-datapacks-test-2-key"…
       |                       ^
     95|   });
     96| 


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/parse-datapacks.test.ts,title=server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array,line=102,column=23::AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "ageUnits": "Ma",%0A    "authoredBy": "authoredBy",%0A    "columnInfo": Object {%0A      "children": Array [%0A        Object {%0A          "children": Array [],%0A          "columnDisplayType": "Ruler",%0A          "editName": "Ma",%0A          "enableTitle": true,%0A          "expanded": false,%0A          "fontOptions": Array [%0A            "Column Header",%0A            "Ruler Label",%0A          ],%0A          "fontsInfo": Object {%0A            "font": "Arial",%0A          },%0A          "maxAge": 1.7976931348623157e+308,%0A          "minAge": 5e-324,%0A          "name": "Ma",%0A          "on": true,%0A          "parent": "Chart Title",%0A          "popup": "",%0A          "rgb": Object {%0A            "b": 255,%0A            "g": 255,%0A            "r": 255,%0A          },%0A          "show": true,%0A          "units": "Ma",%0A          "width": 100,%0A        },%0A      ],%0A      "columnDisplayType": "RootColumn",%0A      "editName": "Chart Title",%0A      "enableTitle": true,%0A      "expanded": true,%0A      "fontOptions": Array [%0A        "Column Header",%0A      ],%0A      "fontsInfo": Object {%0A        "font": "Arial",%0A      },%0A      "maxAge": -99999,%0A      "minAge": 99999,%0A      "name": "Chart Title",%0A      "on": true,%0A      "parent": "Chart Root",%0A      "popup": "",%0A      "rgb": Object {%0A        "b": 255,%0A        "g": 255,%0A        "r": 255,%0A      },%0A      "show": true,%0A      "units": "Ma",%0A      "width": 100,%0A    },%0A    "columnTypeCount": Object {%0A      "Blank": 0,%0A      "Block": 0,%0A      "Chron": 0,%0A      "Event": 0,%0A      "Facies": 0,%0A      "Freehand": 0,%0A      "Point": 0,%0A      "Range": 0,%0A      "Sequence": 0,%0A      "Transect": 0,%0A    },%0A    "datapackImage": "image",%0A    "datapackImageCount": 0,%0A    "defaultChronostrat": "UNESCO",%0A    "description": "description",%0A    "formatVersion": 1.5,%0A+   "hasFiles": false,%0A    "isPublic": true,%0A    "mapPack": Object {%0A      "mapInfo": "",%0A    },%0A    "originalFileName": "file.dpk",%0A    "priority": 0,%0A    "references": Array [],%0A    "size": "size",%0A    "storedFileName": "tempFileName",%0A    "tags": Array [],%0A    "title": "Title",%0A    "totalColumns": 0,%0A    "type": "official",%0A  }%0A%0A ❯ server/__tests__/parse-datapacks.test.ts:102:23%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[2/4]⎯

 FAIL  server/__tests__/parse-datapacks.test.ts > general parse-datapacks tests > should not parse bad file return empty array
AssertionError: expected { columnInfo: { …(17) }, …(20) } to deeply equal { columnInfo: { …(17) }, …(19) }

- Expected
+ Received

  Object {
    "ageUnits": "Ma",
    "authoredBy": "authoredBy",
    "columnInfo": Object {
      "children": Array [
        Object {
          "children": Array [],
          "columnDisplayType": "Ruler",
          "editName": "Ma",
          "enableTitle": true,
          "expanded": false,
          "fontOptions": Array [
            "Column Header",
            "Ruler Label",
          ],
          "fontsInfo": Object {
            "font": "Arial",
          },
          "maxAge": 1.7976931348623157e+308,
          "minAge": 5e-324,
          "name": "Ma",
          "on": true,
          "parent": "Chart Title",
          "popup": "",
          "rgb": Object {
            "b": 255,
            "g": 255,
            "r": 255,
          },
          "show": true,
          "units": "Ma",
          "width": 100,
        },
      ],
      "columnDisplayType": "RootColumn",
      "editName": "Chart Title",
      "enableTitle": true,
      "expanded": true,
      "fontOptions": Array [
        "Column Header",
      ],
      "fontsInfo": Object {
        "font": "Arial",
      },
      "maxAge": -99999,
      "minAge": 99999,
      "name": "Chart Title",
      "on": true,
      "parent": "Chart Root",
      "popup": "",
      "rgb": Object {
        "b": 255,
        "g": 255,
        "r": 255,
      },
      "show": true,
      "units": "Ma",
      "width": 100,
    },
    "columnTypeCount": Object {
      "Blank": 0,
      "Block": 0,
      "Chron": 0,
      "Event": 0,
      "Facies": 0,
      "Freehand": 0,
      "Point": 0,
      "Range": 0,
      "Sequence": 0,
      "Transect": 0,
    },
    "datapackImage": "image",
    "datapackImageCount": 0,
    "defaultChronostrat": "UNESCO",
    "description": "description",
    "formatVersion": 1.5,
+   "hasFiles": false,
    "isPublic": true,
    "mapPack": Object {
      "mapInfo": "",
    },
    "originalFileName": "file.dpk",
    "priority": 0,
    "references": Array [],
    "size": "size",
    "storedFileName": "tempFileName",
    "tags": Array [],
    "title": "Title",
    "totalColumns": 0,
    "type": "official",
  }

 ❯ server/__tests__/parse-datapacks.test.ts:102:23
    100|   it("should not parse bad file return empty array", async () => {
    101|     const datapacks = await parseDatapacks(datapack, "bad-data.txt");
    102|     expect(datapacks).toEqual(key["bad-data-key"]);
       |                       ^
    103|   });
    104| });


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(5) } to deeply equal { …(4) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A+   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[3/4]⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(5) } to deeply equal { …(4) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
+   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[4/4]⎯

 Test Files  2 failed | 16 passed (18)
      Tests  4 failed | 968 passed (972)
   Start at  20:06:15
   Duration  20.05s (transform 1.89s, setup 3ms, collect 14.42s, tests 19.66s, environment 6ms, prepare 5.63s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-27T20:59:47Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 446 to line 446
  - Commit: [e026a09](https://github.com/earthhistoryviz/tsconline/commit/e026a0937f8cb3164b3197fc3ffdebacd5779cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [e026a09](https://github.com/earthhistoryviz/tsconline/commit/e026a0937f8cb3164b3197fc3ffdebacd5779cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [e026a09](https://github.com/earthhistoryviz/tsconline/commit/e026a0937f8cb3164b3197fc3ffdebacd5779cac)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-28T00:33:47Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-28T00:34:53Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 448 to line 448
  - Commit: [b67d9af](https://github.com/earthhistoryviz/tsconline/commit/b67d9aff82033b5db75dc22e569616e3900ab14a)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [b67d9af](https://github.com/earthhistoryviz/tsconline/commit/b67d9aff82033b5db75dc22e569616e3900ab14a)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [b67d9af](https://github.com/earthhistoryviz/tsconline/commit/b67d9aff82033b5db75dc22e569616e3900ab14a)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-28T00:57:17Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-28T01:02:05Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 209 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 451 to line 451
  - Commit: [88596cc](https://github.com/earthhistoryviz/tsconline/commit/88596cc090156d5b15ebac79df18e4359f365d6c)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/209)


  

  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [88596cc](https://github.com/earthhistoryviz/tsconline/commit/88596cc090156d5b15ebac79df18e4359f365d6c)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [88596cc](https://github.com/earthhistoryviz/tsconline/commit/88596cc090156d5b15ebac79df18e4359f365d6c)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-28T01:16:54Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 208 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 149 to line 149
  - Commit: [3a6ba24](https://github.com/earthhistoryviz/tsconline/commit/3a6ba2417c7eee3cc8a8a5710c8d55a7ff9ed18f)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/208)


  

  

  ## 🚨 207 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
           This route handler performs a file system access, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 141 to line 141
  - Commit: [3a6ba24](https://github.com/earthhistoryviz/tsconline/commit/3a6ba2417c7eee3cc8a8a5710c8d55a7ff9ed18f)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/207)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-31T16:24:59Z
body: 🚨 The build has failed. Please check the build logs for more information.

```
Building all workspaces...
src/state/actions/general-actions.ts(46,30): error TS2724: '"./util-actions"' has no exported member named 'downloadFiles'. Did you mean 'downloadFile'?
The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph
Failed with errors in 20s 88ms

```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-31T16:28:00Z
body: 🚨 The build has failed. Please check the build logs for more information.

```
Building all workspaces...
src/state/actions/general-actions.ts(46,30): error TS2724: '"./util-actions"' has no exported member named 'downloadFiles'. Did you mean 'downloadFile'?
The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph
Failed with errors in 20s 617ms

```
author_association: NONE
user: login: lbostre
created_at: 2025-03-31T17:58:58Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-31T17:59:55Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE
user: login: paologum
created_at: 2025-03-31T19:02:31Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-03-31T19:03:28Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-31T19:03:31Z
body: The preview for this PR has been brought down by PR #382.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-03-31T19:53:07Z
body: The preview for this PR has been brought down by PR #388.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-02T18:50:37Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-02T18:51:18Z
body: 🚨 The build has failed. Please check the build logs for more information.

```
Building all workspaces...
src/routes/user-routes.ts(538,14): error TS2451: Cannot redeclare block-scoped variable 'downloadDatapackFilesZip'.
src/routes/user-routes.ts(602,14): error TS2451: Cannot redeclare block-scoped variable 'downloadDatapackFilesZip'.
src/routes/user-routes.ts(550,33): error TS2304: Cannot find name 'getUsersDatapacksDirectoryFromUUIDDirectory'.
src/routes/user-routes.ts(558,26): error TS2304: Cannot find name 'getPDFFilesDirectoryFromDatapackDirectory'.
src/routes/user-routes.ts(575,17): error TS2304: Cannot find name 'fs'.
src/routes/user-routes.ts(614,33): error TS2304: Cannot find name 'getUsersDatapacksDirectoryFromUUIDDirectory'.
src/routes/user-routes.ts(622,26): error TS2304: Cannot find name 'getPDFFilesDirectoryFromDatapackDirectory'.
src/routes/user-auth.ts(89,9): error TS2451: Cannot redeclare block-scoped variable 'downloadDatapackFilesZipParams'.
src/routes/user-auth.ts(98,9): error TS2451: Cannot redeclare block-scoped variable 'downloadDatapackFilesZipParams'.
[36mvite v5.4.15 [32mbuilding for production...[36m[39m
transforming...
[32m✓[39m 14932 modules transformed.
rendering chunks...
computing gzip size...
[2mdist/[22m[32mindex.html                              [39m[1m[2m    0.66 kB[22m[1m[22m[2m │ gzip:     0.42 kB[22m
[2mdist/[22m[2massets/[22m[32mpurify.es-DGIRlouP.js            [39m[1m[2m   21.98 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mTSCreatorLogo-BBvqDlKG.png       [39m[1m[2m   72.32 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mset-datapack-config-C2QobAFi.js  [39m[1m[2m  104.78 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mindex.es-BAQF6XdE.js             [39m[1m[2m  149.96 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mhtml2canvas.esm-CBrSDip1.js      [39m[1m[2m  201.42 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mdownload-pdf-CZARGZYU.js         [39m[1m[2m  358.87 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[35mindex-BNn3WXA6.css               [39m[1m[2m  319.87 kB[22m[1m[22m[2m │ gzip:    56.61 kB[22m
[2mdist/[22m[2massets/[22m[36mindex-BVojQNyq.js                [39m[1m[33m3,522.43 kB[39m[22m[2m │ gzip: 1,020.76 kB[22m
[32m✓ built in 28.35s[39m
[33m
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.[39m
The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph
Failed with errors in 51s 176ms

```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-02T18:51:35Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 219 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/routes/user-routes.ts* from line 636 to line 636
  - Commit: [3fbafdc](https://github.com/earthhistoryviz/tsconline/commit/3fbafdc07d6727e5516193b6bb685fdde25c0aef)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/219)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-02T18:56:42Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/src/routes/user-routes.ts
  567:7  error  'zipfile' is never reassigned. Use 'const' instead  prefer-const

✖ 1 problem (1 error, 0 warnings)
  1 error and 0 warnings potentially fixable with the `--fix` option.


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-02T18:56:56Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/src/routes/user-routes.ts
  567:7  error  'zipfile' is never reassigned. Use 'const' instead  prefer-const

✖ 1 problem (1 error, 0 warnings)
  1 error and 0 warnings potentially fixable with the `--fix` option.


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: paologum
created_at: 2025-04-03T05:41:34Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-03T05:42:26Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-04T01:23:04Z
body: 🚨 The Prettier check has failed. Please run 'yarn prettier-format' locally and commit the changes.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-04T15:46:07Z
body: The preview for this PR has been brought down by PR #397.
author_association: NONE
user: login: paologum
created_at: 2025-04-06T20:33:07Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-06T20:34:04Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE
user: login: paologum
created_at: 2025-04-06T20:37:39Z
body: datapack metadata isn't properly being sent on the pr preview
author_association: CONTRIBUTOR
user: login: paologum
created_at: 2025-04-06T20:40:23Z
body: you also need to change the `dev-config.json` file in the server if you change datapack stuff to include the `hasFiles`
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-06T20:48:16Z
body: The preview for this PR has been brought down by PR #400.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-07T15:31:56Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 245 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 344 to line 344
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/245)


  

  

  ## 🚨 244 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 341 to line 341
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/244)


  

  

  ## 🚨 243 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 216 to line 216
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/243)


  

  

  ## 🚨 242 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 215 to line 215
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/242)


  

  

  ## 🚨 241 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 197 to line 197
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/241)


  

  

  ## 🚨 240 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/user-handler.ts* from line 177 to line 177
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/240)


  

  

  ## 🚨 239 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 548 to line 548
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/239)


  

  

  ## 🚨 238 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 542 to line 542
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/238)


  

  

  ## 🚨 237 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 519 to line 519
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/237)


  

  

  ## 🚨 236 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 513 to line 513
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/236)


  

  

  ## 🚨 235 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
           This path depends on a user-provided value.
           This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 362 to line 362
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/235)


  

  

  ## 🚨 234 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
           This path depends on a user-provided value.
           This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 358 to line 358
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/234)


  

  

  ## 🚨 233 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 343 to line 343
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/233)


  

  

  ## 🚨 232 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/user/chart-history.ts* from line 156 to line 156
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/232)


  

  

  ## 🚨 231 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 281 to line 281
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/231)


  

  

  ## 🚨 230 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 237 to line 237
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/230)


  

  

  ## 🚨 229 js/path-injection: Uncontrolled data used in path expression
  - Severity: **high**
  - Message: This path depends on a user-provided value.
  - Located in *server/src/upload-handlers.ts* from line 229 to line 229
  - Commit: [619c618](https://github.com/earthhistoryviz/tsconline/commit/619c618bcf8b32a5d9587ab6d1d3a5af0f4363f5)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/229)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-07T15:32:44Z
body: 🚨 Vitest tests have failed. Please check the test logs for more information.

```

 RUN  v1.6.1 /home/runner/work/tsconline/tsconline
      Coverage enabled with v8

 ✓ server/__tests__/upload-handlers.test.ts  (83 tests) 104ms
 ✓ server/__tests__/login-routes.test.ts  (143 tests) 329ms
 ✓ server/__tests__/user-routes.test.ts  (93 tests) 230ms
 ✓ server/__tests__/admin-routes.test.ts  (276 tests) 592ms
 ✓ server/__tests__/user-handler.test.ts  (87 tests) 57ms
 ✓ server/__tests__/parse-datapacks.test.ts  (107 tests) 89ms
 ✓ server/__tests__/parse-map-packs.test.ts  (35 tests) 30ms
 ✓ app/__tests__/parse-settings.test.ts  (51 tests) 30ms
 ❯ server/__tests__/upload-datapack.test.ts  (19 tests | 1 failed) 35ms
   ❯ server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
     → expected { …(4) } to deeply equal { …(5) }
 ✓ server/__tests__/crossplot-routes.test.ts  (12 tests) 56ms
 ✓ server/__tests__/edit-handler.test.ts  (9 tests) 13ms
 ✓ app/__tests__/data-mining.test.ts  (16 tests) 9ms
 ✓ server/__tests__/workshop-routes.test.ts  (11 tests) 139ms
 ✓ server/__tests__/chart-history.test.ts  (18 tests) 22ms
 ✓ server/__tests__/crossplot-handlers.test.ts  (9 tests) 11ms
 ✓ server/__tests__/general-file-handler-requests.test.ts  (7 tests) 12ms
 ✓ server/__tests__/util.test.ts  (19 tests) 11ms
 ✓ server/__tests__/extract-markers.test.ts  (7 tests) 9ms
 ✓ shared/__tests__/util.test.ts  (14 tests) 8ms
 ✓ server/__tests__/crossplot-jar-handlers.test.ts  (7 tests) 13270ms
 ✓ server/__tests__/encryption.test.ts  (7 tests) 11002ms

⎯⎯⎯⎯⎯⎯⎯ Failed Tests 1 ⎯⎯⎯⎯⎯⎯⎯

 FAIL  server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file, filepath, tempProfilePictureFilepath, and datapackMetadata if successful
AssertionError: expected { …(4) } to deeply equal { …(5) }

- Expected
+ Received

  Object {
    "datapackMetadata": Object {},
    "file": Object {
      "file": Object {
        "bytesRead": 1,
      },
    },
    "filepath": "test",
-   "pdfFields": Object {},
    "tempProfilePictureFilepath": undefined,
  }

 ❯ server/__tests__/upload-datapack.test.ts:167:17
    165|     uploadUserDatapackHandler.mockResolvedValueOnce({} as DatapackMeta…
    166|     const val = await getDatapackMetadataFromIterableAndTemporarilyDow…
    167|     expect(val).toEqual({
       |                 ^
    168|       file: { file: { bytesRead: 1 } } as MultipartFile,
    169|       filepath: "test",


::error file=/home/runner/work/tsconline/tsconline/server/__tests__/upload-datapack.test.ts,title=server/__tests__/upload-datapack.test.ts > getDatapackMetadataFromIterableAndTemporarilyDownloadDatapack > should return file%2C filepath%2C tempProfilePictureFilepath%2C and datapackMetadata if successful,line=167,column=17::AssertionError: expected { …(4) } to deeply equal { …(5) }%0A%0A- Expected%0A+ Received%0A%0A  Object {%0A    "datapackMetadata": Object {},%0A    "file": Object {%0A      "file": Object {%0A        "bytesRead": 1,%0A      },%0A    },%0A    "filepath": "test",%0A-   "pdfFields": Object {},%0A    "tempProfilePictureFilepath": undefined,%0A  }%0A%0A ❯ server/__tests__/upload-datapack.test.ts:167:17%0A%0A
⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯[1/1]⎯

 Test Files  1 failed | 20 passed (21)
      Tests  1 failed | 1029 passed (1030)
   Start at  15:32:17
   Duration  21.36s (transform 1.64s, setup 1ms, collect 15.31s, tests 26.06s, environment 6ms, prepare 6.35s)


```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:37:00Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/__tests__/user-routes.test.ts
  27:8  error  'path' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:37:45Z
body: 🚨 The build has failed. Please check the build logs for more information.

```
Building all workspaces...
src/routes/user-routes.ts(530,20): error TS2304: Cannot find name 'createZipFile'.
src/routes/user-auth.ts(140,5): error TS2304: Cannot find name 'downloadWorkshopFilesZip'.
[36mvite v5.4.15 [32mbuilding for production...[36m[39m
transforming...
[32m✓[39m 14933 modules transformed.
rendering chunks...
computing gzip size...
[2mdist/[22m[32mindex.html                              [39m[1m[2m    0.66 kB[22m[1m[22m[2m │ gzip:     0.42 kB[22m
[2mdist/[22m[2massets/[22m[32mpurify.es-DGIRlouP.js            [39m[1m[2m   21.98 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mTSCreatorLogo-BBvqDlKG.png       [39m[1m[2m   72.32 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mset-datapack-config-C2QobAFi.js  [39m[1m[2m  104.78 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mindex.es-BAQF6XdE.js             [39m[1m[2m  149.96 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mhtml2canvas.esm-CBrSDip1.js      [39m[1m[2m  201.42 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[32mdownload-pdf-CZARGZYU.js         [39m[1m[2m  358.87 kB[22m[1m[22m
[2mdist/[22m[2massets/[22m[35mindex-Bt5Z2vuA.css               [39m[1m[2m  321.67 kB[22m[1m[22m[2m │ gzip:    56.90 kB[22m
[2mdist/[22m[2massets/[22m[36mindex-1GxgixNb.js                [39m[1m[33m3,533.00 kB[39m[22m[2m │ gzip: 1,023.56 kB[22m
[32m✓ built in 27.73s[39m
[33m
(!) Some chunks are larger than 500 kB after minification. Consider:
- Using dynamic import() to code-split the application
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.[39m
The command failed for workspaces that are depended upon by other workspaces; can't satisfy the dependency graph
Failed with errors in 49s 808ms

```
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:40:43Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/__tests__/user-routes.test.ts
  27:8  error  'path' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:45:08Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/__tests__/user-routes.test.ts
  27:8  error  'path' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:45:14Z
body: 🚨 The ESLint check has failed. Please address the following issues:

```

/home/runner/work/tsconline/tsconline/server/__tests__/user-routes.test.ts
  27:8  error  'path' is defined but never used  @typescript-eslint/no-unused-vars

✖ 1 problem (1 error, 0 warnings)


```
Run 'yarn lint-format' locally to fix some of these issues automatically.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:46:14Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 246 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 128 to line 128
  - Commit: [6b29854](https://github.com/earthhistoryviz/tsconline/commit/6b298542b80d15002e4da46dc4b0b123eba37dce)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/246)


  

author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-14T18:46:21Z
body: ## 🔍 The CodeQL analysis found some issues. Please address the following alerts:


  

  ## 🚨 246 js/missing-rate-limiting: Missing rate limiting
  - Severity: **high**
  - Message: This route handler performs authorization, but is not rate-limited.
  - Located in *server/src/routes/user-auth.ts* from line 128 to line 128
  - Commit: [7327704](https://github.com/earthhistoryviz/tsconline/commit/73277042d5dab5a474ad83e8ec6ea078f4282183)
  - [Click here for more information on how to solve](https://github.com/earthhistoryviz/tsconline/security/code-scanning/246)


  

author_association: NONE
user: login: paologum
created_at: 2025-04-14T20:14:04Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-14T20:15:01Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE
user: login: github-actions[bot]
created_at: 2025-04-15T03:54:20Z
body: The preview for this PR has been brought down by PR #415.
author_association: NONE
user: login: paologum
created_at: 2025-04-18T01:55:16Z
body: /deploy
author_association: CONTRIBUTOR
user: login: github-actions[bot]
created_at: 2025-04-18T01:56:20Z
body: 🚀 Preview deployed! You can access it [here](https://pr-preview.geolex.org).
To bring down the preview close the PR.
author_association: NONE