Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ export default defineConfig([
}
},
{
files: ["**/*.js", "js/app.mjs", "js/ip_access_control.mjs"],
files: ["**/*.js", "js/app.mjs", "js/ip_access_control.mjs", "js/server.mjs", "js/vendor.mjs"],
languageOptions: {
ecmaVersion: "latest",
globals: {
Expand Down Expand Up @@ -104,7 +104,7 @@ export default defineConfig([
}
},
{
files: ["**/*.js", "js/app.mjs", "js/ip_access_control.mjs"],
files: ["**/*.js", "js/app.mjs", "js/ip_access_control.mjs", "js/server.mjs", "js/vendor.mjs"],
ignores: [
"clientonly/index.js",
"js/logger.js",
Expand All @@ -118,7 +118,7 @@ export default defineConfig([
},
{
files: ["**/*.mjs"],
ignores: ["js/app.mjs", "js/ip_access_control.mjs"],
ignores: ["js/app.mjs", "js/ip_access_control.mjs", "js/server.mjs", "js/vendor.mjs"],
languageOptions: {
ecmaVersion: "latest",
globals: {
Expand Down
2 changes: 1 addition & 1 deletion js/app.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { spawn } from "node:child_process";
import { Agent, setGlobalDispatcher } from "undici";
import packageJson from "../package.json" with { type: "json" };
import Log from "./logger.js";
import Server from "./server.js";
import Server from "./server.mjs";
import Utils from "./utils.js";
import serverFunctions from "#server_functions";

Expand Down
6 changes: 3 additions & 3 deletions js/loader.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import "../defaultmodules/defaultmodules.js";
import "./vendor.js";
import "./vendor.mjs";

/* Module state */

Expand Down Expand Up @@ -274,7 +274,7 @@ export const loadModules = async () => {

/**
* Load a file (script or stylesheet).
* Prevent double loading and search for files defined in js/vendor.js.
* Prevent double loading and search for files defined in js/vendor.mjs.
* @param {string} fileName Path of the file we want to load.
* @param {Module} module The module that calls the loadFile function.
* @returns {Promise} resolved when the file is loaded
Expand All @@ -293,7 +293,7 @@ export const loadFileForModule = (fileName, module) => {
}

if (globalThis.vendor[fileName] !== undefined) {
// This file is defined in js/vendor.js.
// This file is defined in js/vendor.mjs.
// Load it from its location.
loadedFiles.push(fileName.toLowerCase());
return loadFile(`${globalThis.vendor[fileName]}`);
Expand Down
33 changes: 16 additions & 17 deletions js/server.js → js/server.mjs
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
const fs = require("node:fs");
const http = require("node:http");
const https = require("node:https");
const path = require("node:path");
const express = require("express");
const helmet = require("helmet");
const socketio = require("socket.io");
const Log = require("logger");

const { ipAccessControl, socketIpAccessControl } = require("./ip_access_control.mjs");

const vendor = require("./vendor");

const { getHtml, getVersion, getEnvVars, getServerPort, cors } = require("#server_functions");
import fs from "node:fs";
import http from "node:http";
import https from "node:https";
import path from "node:path";
import express from "express";
import helmet from "helmet";
import { Server as SocketServer } from "socket.io";
import Log from "./logger.js";
import { ipAccessControl, socketIpAccessControl } from "./ip_access_control.mjs";
import vendor from "./vendor.mjs";
import serverFunctions from "#server_functions";

const { getHtml, getVersion, getEnvVars, getServerPort, cors } = serverFunctions;

/**
* Server
Expand Down Expand Up @@ -60,7 +59,7 @@ class Server {
} else {
this.#server = http.Server(app);
}
const io = socketio(this.#server, {
const io = new SocketServer(this.#server, {
allowRequest: socketIpAccessControl(config.ipWhitelist, config.trustedProxies),
allowEIO3: true,
pingInterval: 120000, // server → client ping every 2 mins
Expand Down Expand Up @@ -106,7 +105,7 @@ class Server {

app.use(ipAccessControl(config.ipWhitelist, config.trustedProxies));
app.use(helmet(config.httpHeaders));
app.use("/js", express.static(__dirname));
app.use("/js", express.static(import.meta.dirname));

const getConfigFileError = (filename) => (req, res) => {
const errorText = `<!DOCTYPE html>\n<html lang="en">\n<head>\n<meta charset="utf-8">\n<title>Error</title>\n</head>\n<body>\n<pre>Cannot GET /config/${filename}</pre>\n</body>\n</html>`;
Expand Down Expand Up @@ -198,4 +197,4 @@ class Server {
}
}

module.exports = Server;
export default Server;
4 changes: 1 addition & 3 deletions js/vendor.js → js/vendor.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,4 @@ const vendor = {

globalThis.vendor = vendor;

if (typeof module !== "undefined") {
module.exports = vendor;
}
export default vendor;
3 changes: 1 addition & 2 deletions tests/e2e/helpers/global-setup.js
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,11 @@ exports.getPage = () => {
exports.startApplication = async (configFilename) => {
vi.resetModules();

// Clear CommonJS config and server caches; the ESM app is reused across starts.
// Clear CommonJS config caches; the ESM app is reused across starts.
Object.keys(require.cache).forEach((key) => {
if (
key.includes("/tests/configs/")
|| key.includes("/config/config")
|| key.includes("/js/server.js")
) {
delete require.cache[key];
}
Expand Down
6 changes: 6 additions & 0 deletions tests/e2e/helpers/global-setup.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import {createRequire} from "node:module";

// Load natively: when Vitest evaluates global-setup.js itself, app.mjs would run inside Vite's module loader.
const helpers = createRequire(import.meta.url)("./global-setup.js");

export const {getPage, startApplication, stopApplication, getDocument, fixupIndex, restoreIndex} = helpers;
9 changes: 4 additions & 5 deletions tests/e2e/vendor_spec.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
const helpers = require("./helpers/global-setup");
import vendors from "../../js/vendor.mjs";
import { startApplication, stopApplication } from "./helpers/global-setup.mjs";

describe("Vendors", () => {
beforeAll(async () => {
await helpers.startApplication("tests/configs/default.js");
await startApplication("tests/configs/default.js");
});

afterAll(async () => {
await helpers.stopApplication();
await stopApplication();
});

describe("Get list vendors", () => {
const vendors = require(`${global.root_path}/js/vendor.js`);

Object.keys(vendors).forEach((vendor) => {
it(`should return 200 HTTP code for vendor "${vendor}"`, async () => {
const urlVendor = `http://localhost:8080/${vendors[vendor]}`;
Expand Down
Loading