intlayer-editor
Version:
Integrate the Intlayer visual editor into your Intlayer projects, enabling CMS-like content management with multilingual support.
79 lines (78 loc) • 2.87 kB
JavaScript
import { getConfiguration, getEnvFilePath } from "@intlayer/config";
import { configurationRouter } from "./routes/config.routes.mjs";
import { dictionaryRouter } from "./routes/dictionary.routes.mjs";
import { checkPortAvailability } from "./utils/checkPortAvailability.mjs";
import compression from "compression";
import cookieParser from "cookie-parser";
import cors from "cors";
import express from "express";
import { intlayer } from "express-intlayer";
import helmet from "helmet";
import mime from "mime";
import { existsSync, lstatSync, readFileSync } from "node:fs";
import path, { dirname, resolve } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const envFileOptions = {
env: process.env.NODE_ENV,
envFile: process.env.ENV_FILE
};
const packageJson = JSON.parse(
readFileSync(resolve(__dirname, "../../package.json"), "utf8")
);
const app = express();
app.use(intlayer());
const FALLBACK_PORT = 8e3;
const config = getConfiguration(envFileOptions);
const port = config.editor.port ?? FALLBACK_PORT;
const clientDistPath = resolve(__dirname, "../../client/dist");
const corsOptions = {
origin: "*",
credentials: true
};
const startServer = async (app2) => {
const isPortAvailable = await checkPortAvailability(port);
if (!isPortAvailable) {
console.error(`\x1B[1;31mError: Port ${port} is already in use.\x1B[0m`);
process.exit(255);
}
app2.disable("x-powered-by");
app2.use(
helmet({
contentSecurityPolicy: false
})
);
app2.use(cors(corsOptions));
app2.use(compression());
app2.use(express.json());
app2.use(cookieParser());
app2.use(express.urlencoded({ extended: true }));
app2.use("/api/dictionary", dictionaryRouter);
app2.use("/api/config", configurationRouter);
app2.use(express.static(clientDistPath));
app2.get(/(.*)/, (req, res) => {
const requestedPath = path.join(clientDistPath, req.url);
if (existsSync(requestedPath) && lstatSync(requestedPath).isFile()) {
const mimeType = mime.getType(requestedPath) ?? "application/octet-stream";
res.setHeader("Content-Type", mimeType);
res.sendFile(requestedPath);
} else {
res.sendFile(resolve(clientDistPath, "index.html"));
}
});
app2.listen(port, () => {
const dotEnvFilePath = getEnvFilePath(
envFileOptions.env,
envFileOptions.envFile
);
console.log(`
\x1B[1;90mINTLAYER v${packageJson.version}\x1B[0m
Editor running at: \x1B[90mhttp://localhost:${port}\x1B[0m
- Watching application at: ${config.editor.applicationURL === "" ? "-" : `\x1B[90m${config.editor.applicationURL}\x1B[0m`}
- Access key: ${config.editor.clientId ?? "-"}
- Environment: ${dotEnvFilePath ?? "-"}
`);
});
};
startServer(app);
//# sourceMappingURL=index.mjs.map