From 1b23f950505ee923a4044a1982b2fb3353ebb2fe Mon Sep 17 00:00:00 2001
From: Sebastien DUMETZ <s.dumetz@holusion.com>
Date: Mon, 8 Jan 2024 10:20:45 +0100
Subject: [PATCH] speed up build process by importing voyager build script into
 source/ui

use legacy-peer-deps for voyager until https://github.com/Smithsonian/dpo-voyager/pull/243 is merged

fix build scripts to properly skip voyager standalone build
---
 .github/workflows/build.yml          |  4 +--
 Dockerfile                           |  5 +---
 README.md                            | 20 +++++++++++++++
 package.json                         |  1 -
 source/server/templates/explorer.hbs |  2 +-
 source/server/templates/story.hbs    |  4 +--
 source/ui/corpus.hbs                 | 20 ---------------
 source/ui/story.hbs                  | 33 -------------------------
 source/ui/webpack.config.js          | 37 ++++++++++++++++++++++++----
 9 files changed, 57 insertions(+), 69 deletions(-)
 create mode 100644 README.md
 delete mode 100644 source/ui/corpus.hbs
 delete mode 100644 source/ui/story.hbs

diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 172a558b..5687faab 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -17,11 +17,9 @@ jobs:
           node-version: 16
           cache: 'npm'
       - name: install voyager dependencies
-        run: (cd source/voyager && npm ci)
+        run: (cd source/voyager && npm ci --legacy-peer-deps)
       - name: install ui dependencies
         run: npm ci && (cd source/ui && npm ci)
-      - name: build voyager
-        run: npm run build-voyager
       - name: build UI
         run: npm run build-ui
   build-server:
diff --git a/Dockerfile b/Dockerfile
index ea594cd4..cc509f0c 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -7,7 +7,7 @@ COPY source/server/package*.json /app/source/server/
 RUN (cd /app/source/server && npm ci)
 
 COPY source/voyager/package*.json /app/source/voyager/
-RUN (cd /app/source/voyager && npm ci)
+RUN (cd /app/source/voyager && npm ci --legacy-peer-deps)
 
 COPY source/ui/package*.json /app/source/ui/
 RUN (cd /app/source/ui && npm ci)
@@ -21,9 +21,6 @@ RUN npm run build-server
 # outputs files in /app/source/server/dist
 
 COPY source/voyager /app/source/voyager
-RUN npm run build-voyager
-# files are automatically picked up by build-ui
-
 COPY source/ui /app/source/ui
 RUN npm run build-ui
 # outputs files in /app/dist
diff --git a/README.md b/README.md
new file mode 100644
index 00000000..10aac341
--- /dev/null
+++ b/README.md
@@ -0,0 +1,20 @@
+# eCorpus
+
+## Description
+
+This is the code repository for **eCorpus**, a content management system by the [eThesaurus](https://ethesaurus.holusion.com) consortium.
+
+## Installation
+
+Follow the [Quick Start Guide](https://ethesaurus.holusion.com/en/doc/tutorials/deployment.html).
+
+## Repository structure
+
+The repository uses recursive [submodules](https://git-scm.com/docs/gitsubmodules), because the upstream [DPO-Voyager](https://github.com/) uses them.
+
+It means some commands will need to be run with the `--recurse-submodules` flag, or you will need to run `git submodule update --init --recursive` after cloning the repository.
+
+eg: `git clone --recurse-submodules git@github.com:Holusion/eCorpus`
+
+Day-to-day operations can be simplified by configuring git (globally or for thsi repository) to always recurse by default : `git config submodule.recurse true`.
+
diff --git a/package.json b/package.json
index 2542e067..f15f79bd 100644
--- a/package.json
+++ b/package.json
@@ -7,7 +7,6 @@
     "test": "echo \"Error: no test specified\" && exit 1",
     "build-ui": "cd source/ui && webpack --mode=production",
     "build-server": "tsc -b source/server",
-    "build-voyager": "cd source/voyager/source/client; webpack --mode=production --env=app=all",
     "watch": "cd source/server && HOT_RELOAD=1 NODE_ENV=development ROOT_DIR=\"../../\" nodemon -e ts,js -w . -w ../ui/webpack.config.js -x ts-node index.ts"
   },
   "author": "Holusion <contact@holusion.com>",
diff --git a/source/server/templates/explorer.hbs b/source/server/templates/explorer.hbs
index 8455e2e1..c9d588bd 100644
--- a/source/server/templates/explorer.hbs
+++ b/source/server/templates/explorer.hbs
@@ -1,3 +1,3 @@
 
 <voyager-explorer resourceroot="/dist/" root="/scenes/{{scene}}/" referrer="{{referrer}}" lang="{{lang}}"></voyager-explorer>
-<script type="text/javascript" src="/dist/js/voyager-explorer.min.js"></script>
+<script type="text/javascript" src="/dist/js/voyager-explorer.js"></script>
diff --git a/source/server/templates/story.hbs b/source/server/templates/story.hbs
index 0368a21b..bca3d94c 100644
--- a/source/server/templates/story.hbs
+++ b/source/server/templates/story.hbs
@@ -1,4 +1,4 @@
 
 <voyager-story resourceRoot="/dist/" root="/scenes/{{scene}}/" referrer="{{referrer}}" lang="{{lang}}" mode="{{mode}}"></voyager-story>
-<script type="text/javascript" src="/dist/js/voyager-story.min.js"></script>
-<link rel="stylesheet" href="/dist/css/voyager-story.min.css">
\ No newline at end of file
+<script type="text/javascript" src="/dist/js/voyager-story.js"></script>
+<link rel="stylesheet" href="/dist/css/voyager-story.css">
\ No newline at end of file
diff --git a/source/ui/corpus.hbs b/source/ui/corpus.hbs
deleted file mode 100644
index 9458c48b..00000000
--- a/source/ui/corpus.hbs
+++ /dev/null
@@ -1,20 +0,0 @@
-<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-        <title>{{title}}</title>
-
-        <link rel="shortcut icon" type="image/png" href="/static/favicon.png"/>
-        <style>
-            body{
-                background: #303030; 
-            }
-        </style>
-        
-    </head>
-    <body>
-        {{{element}}}
-    </body>
-</html>
\ No newline at end of file
diff --git a/source/ui/story.hbs b/source/ui/story.hbs
deleted file mode 100644
index 69ba1634..00000000
--- a/source/ui/story.hbs
+++ /dev/null
@@ -1,33 +0,0 @@
-<!DOCTYPE html>
-<html>
-    <head>
-        <meta charset="utf-8">
-        <meta name="viewport" content="width=device-width, initial-scale=1.0">
-
-        <title>{{title}}</title>
-
-        <link rel="shortcut icon" type="image/png" href="/images/logo-ecorpus.png"/>
-        <link href="/fonts/fonts.css" rel="stylesheet">
-
-        <style>
-            body { background: #303030; }
-        </style>
-
-        {{#if isDevelopment}}
-        <script src="/libs/three/three.js"></script>
-        {{else}}
-        <script src="/libs/three/three.min.js"></script>
-        {{/if}}
-
-        <style>
-            /* overrides */
-            .sv-asset-panel .sv-panel-header{
-                display: none;
-            }
-        </style>
-
-    </head>
-    <body>
-        {{{element}}}
-    </body>
-</html>
\ No newline at end of file
diff --git a/source/ui/webpack.config.js b/source/ui/webpack.config.js
index e1a38d82..5ff83327 100644
--- a/source/ui/webpack.config.js
+++ b/source/ui/webpack.config.js
@@ -42,16 +42,16 @@ const dirs = {
     assets: path.resolve( project, "source/ui/assets"),
 };
 
+const createVoyagerConfig = require(path.join(project, "source/voyager/source/client/webpack.config.js"));
 
 
 ////////////////////////////////////////////////////////////////////////////////
 
-module.exports = function createAppConfig(env, argv)
+module.exports = function createAppConfig(env, argv={})
 {
     const isDevMode = (typeof argv?.mode !== "undefined") ? argv.mode !== "production" : process.env["NODE_ENV"] !== "production";
     const devMode = isDevMode ? "development" : "production";
     
-
     const config = {
         mode: devMode,
         cache: {type: "filesystem"},
@@ -64,7 +64,7 @@ module.exports = function createAppConfig(env, argv)
             filename: "js/[name].js",
             
             publicPath: '/',
-            clean: true,
+            clean: false,
         },
 
         resolve: {
@@ -98,7 +98,7 @@ module.exports = function createAppConfig(env, argv)
                     },
                     { 
                         from: "{js,js/draco,css,language,images}/*.{js,json,wasm,css,jpg,png,svg}",
-                        context: path.join(project, "source/voyager/dist/"),
+                        context: path.join(project, "source/voyager/assets/"),
                         force: false,
                         priority: 1,
                     },
@@ -161,5 +161,32 @@ module.exports = function createAppConfig(env, argv)
         config.devtool = "source-map";
     }
 
-    return config;
+    const voyagerConfig = createVoyagerConfig({app: "all"}, argv);
+    /********************************
+     * Override voyagerConfig's options
+     ********************************/
+
+    //Always use the same file name
+    Object.assign(voyagerConfig.output, {
+        path: dirs.output,
+        clean: false,
+        filename: "js/[name].js",
+    });
+
+    //Remove HTML exports
+    voyagerConfig.plugins = voyagerConfig.plugins.filter(p=>p.constructor?.name !="HtmlWebpackPlugin");
+    //Remove Copy Plugin
+    voyagerConfig.plugins = voyagerConfig.plugins.filter(p=>p.constructor?.name !="CopyPlugin");
+
+    const cssPlugin = voyagerConfig.plugins.find(p=>p.constructor?.name =="MiniCssExtractPlugin");
+    if(!cssPlugin) throw new Error("MiniCssExtractPlugin not found in voyagerConfig.plugins");
+    Object.assign(cssPlugin.options, {
+        filename: "css/[name].css",
+        chunkFilename: "css/[name].css",
+    });
+
+    //Use filesystem cache for faster initial builds
+    Object.assign(voyagerConfig, {cache: {type: "filesystem"}});
+
+    return [config, voyagerConfig];
 }
-- 
GitLab