From cd755fcd1c0fb003f8dd5f5df90991acb209be55 Mon Sep 17 00:00:00 2001
From: flashwave <me@flash.moe>
Date: Fri, 11 Apr 2025 19:39:42 +0000
Subject: [PATCH] Switch to a .env file instead of config.json.

---
 .env.example               | 18 ++++++++++++++++++
 .gitignore                 |  1 +
 Makefile                   | 11 ++++++-----
 README.md                  | 26 +++++++++++++++++++-------
 build.js                   | 25 ++++++++++++++++---------
 config/config.example.json |  6 ------
 6 files changed, 60 insertions(+), 27 deletions(-)
 create mode 100644 .env.example
 delete mode 100644 config/config.example.json

diff --git a/.env.example b/.env.example
new file mode 100644
index 0000000..2cd9eac
--- /dev/null
+++ b/.env.example
@@ -0,0 +1,18 @@
+# Values contained below are also the defaults.
+
+# Enable debug mode
+# Primarily turns off minification of output styles, might also display more info in the console
+#MAMI_DEBUG=1
+
+# Application title
+# Sets the title of the application, might be overridden for the window title by the common settings below once they're loaded
+#MAMI_TITLE="Flashii Chat"
+
+# Common configuration location
+# Contains further information shared by the other chat client
+#FUTAMI_URL="//futami.flashii.net/common.json"
+
+# Compatibility client location
+# Alternative chat client for older browser, redirected to when checks in init.js fail
+# Also has a handy little button in the settings.
+#AMI_URL="//sockchat.flashii.net"
diff --git a/.gitignore b/.gitignore
index 8ac51c1..c21d614 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
 /public/assets
 /public/index.html
 /public/mami.webmanifest
+/.env
diff --git a/Makefile b/Makefile
index dfea755..2d91467 100644
--- a/Makefile
+++ b/Makefile
@@ -2,6 +2,7 @@ NODE_EXE := $(shell which node)
 NPM_EXE := $(shell which npm)
 
 BUILD_EXE := build.js
+ENV_FILE := .env
 
 all: install build
 
@@ -12,18 +13,18 @@ update:
 	${NPM_EXE} update --save
 
 build:
-	${NODE_EXE} ${BUILD_EXE}
+	${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE}
 
 rebuild-css:
-	${NODE_EXE} ${BUILD_EXE} css
+	${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} css
 
 rebuild-html:
-	${NODE_EXE} ${BUILD_EXE} html
+	${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} html
 
 rebuild-js:
-	${NODE_EXE} ${BUILD_EXE} js
+	${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} js
 
 rebuild-webmanifest:
-	${NODE_EXE} ${BUILD_EXE} webmanifest
+	${NODE_EXE} --env-file-if-exists ${ENV_FILE} ${BUILD_EXE} webmanifest
 
 .PHONY: all install update build rebuild-css rebuild-html rebuild-js rebuild-webmanifest
diff --git a/README.md b/README.md
index f23f6cf..8a8ff57 100644
--- a/README.md
+++ b/README.md
@@ -4,17 +4,29 @@ The Flashii Chat client.
 
 ## Configuration
 
-Configuration consists of a `config.json` file that contains the various URLs and a default chat title (the unified one is taken from whatever the remote `common.json` supplies).
-Make sure you create the file before building. An example is also supplied.
+Configuration consists of a `.env` file that contains the various URLs and a default chat title (the unified one is taken from whatever the remote `common.json` supplies).
+The defaults supplied by `build.js` are what are used for the production instance. Make sure you modify them as needed!
 
 ## Building
 
-Mami uses a build script written in Node.js; make sure you have NPM available and then run the following commands.
+Mami uses a build script written in Node.js and a Makefile to make life easier.
+I recommend using something like `nvm` with a Node version of at least `v22.14.0 (LTS)`.
+
+The following make recipes are available:
 
 ```sh
-# Installs packages without updating package.json or package-lock.json
-npm ci
+# Runs the package install and build recipes
+make [all]
 
-# Runs the build process, make sure to run this after updates or changes as well
-node build.js
+# Installs package versions expected by package-lock.json
+make install
+
+# Runs the build process
+make build
+
+# Updates latest versions of packages expected by package.json
+make update
+
+# Rebuild a specific type of asset for speedier development
+make rebuild-css / rebuild-html / rebuild-js / rebuild-webmanifest
 ```
diff --git a/build.js b/build.js
index 0793db0..6f5fc53 100644
--- a/build.js
+++ b/build.js
@@ -4,8 +4,8 @@ const fs = require('fs');
 const exec = require('util').promisify(require('child_process').exec);
 
 (async () => {
-    const config = JSON.parse(fs.readFileSync(pathJoin(__dirname, 'config/config.json')));
-    const isDebug = fs.existsSync(pathJoin(__dirname, '.debug'));
+    const title = process.env.MAMI_TITLE ?? 'Flashii Chat';
+    const isDebug = !!process.env.MAMI_DEBUG;
 
     const env = {
         root: __dirname,
@@ -15,14 +15,11 @@ const exec = require('util').promisify(require('child_process').exec);
         swc: { es: 'es2021' },
         housekeep: [ pathJoin(__dirname, 'public', 'assets') ],
         vars: {
-            html: {
-                title: config.title,
-            },
+            html: { title },
             build: {
                 FUTAMI_DEBUG: isDebug,
-                FUTAMI_URL: config.common_url,
-                MAMI_URL: config.modern_url,
-                AMI_URL: config.compat_url,
+                FUTAMI_URL: process.env.FUTAMI_URL ?? '//futami.flashii.net/common.json',
+                AMI_URL: process.env.AMI_URL ?? '//sockchat.flashii.net',
                 GIT_HASH: (await exec('git log --pretty="%H" -n1 HEAD')).stdout,
             },
         },
@@ -37,7 +34,17 @@ const exec = require('util').promisify(require('child_process').exec);
             { source: 'mami.css', target: '/assets', name: 'mami.{hash}.css', vars: { html: ':source' } },
         ],
         webmanifest: [
-            { source: 'mami.webmanifest', target: '/', name: 'mami.webmanifest', icons: '/icons', vars: { html: ':source' }, body: { name: config.title, short_name: config.title } }
+            {
+                source: 'mami.webmanifest',
+                target: '/',
+                name: 'mami.webmanifest',
+                icons: '/icons',
+                vars: { html: ':source' },
+                body: {
+                    name: title,
+                    short_name: title,
+                },
+            },
         ],
         html: [
             { source: 'mami.html', target: '/', name: 'index.html', template: 'html' },
diff --git a/config/config.example.json b/config/config.example.json
deleted file mode 100644
index dabc3fe..0000000
--- a/config/config.example.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
-    "title": "Flashii Chat",
-    "common_url": "//futami.flashii.net/common.json",
-    "modern_url": "//chat.flashii.net",
-    "compat_url": "//sockchat.flashii.net"
-}