Skip to content

Commit 1e7b051

Browse files
committed
feat(server): add index.html generating
1 parent 4b57b46 commit 1e7b051

File tree

8 files changed

+243
-74
lines changed

8 files changed

+243
-74
lines changed

server/package-lock.json

Lines changed: 122 additions & 61 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

server/package.json

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,15 @@
1515
"author": "",
1616
"license": "ISC",
1717
"dependencies": {
18-
"@fastify/static": "^6.10.2",
19-
"fastify": "^4.21.0"
18+
"@fastify/static": "^6.11.2",
19+
"ejs": "^3.1.9",
20+
"fastify": "^4.23.2"
2021
},
2122
"devDependencies": {
22-
"@types/node": "^20.4.4",
23-
"eslint": "^8.46.0",
23+
"@types/ejs": "^3.1.2",
24+
"@types/node": "^20.6.2",
25+
"eslint": "^8.49.0",
2426
"nodemon": "^3.0.1",
25-
"prettier": "^3.0.0"
27+
"prettier": "^3.0.3"
2628
}
2729
}

server/src/frameworks/frameworksControllers.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,22 @@
1+
// @ts-check
12
import { loadFrameworkVersions } from "./frameworksServices.js";
3+
import { generateIndexHtml } from "./helpers/index.js";
4+
import path from "node:path";
5+
import { cwd } from "node:process";
6+
7+
const projectRootPath = path.join(cwd(), "..");
28

39
/**
410
* @typedef {import("fastify").FastifyRequest} Request
511
* @typedef {import("fastify").FastifyReply} Reply
612
*/
713

814
/**
15+
* Get framework versions.
916
* @param {Request} request
1017
* @param {Reply} reply
1118
*/
12-
export async function getFrameworksVersions(_request, reply) {
19+
export async function getFrameworksVersions(request, reply) {
1320
performance.mark("Start");
1421

1522
const frameworks = await loadFrameworkVersions();
@@ -26,3 +33,14 @@ export async function getFrameworksVersions(_request, reply) {
2633

2734
return reply.send(frameworks);
2835
}
36+
37+
/**
38+
* Get and serve the index HTML page.
39+
* @param {Request} request
40+
* @param {Reply} reply
41+
*/
42+
export async function generateAndServeIndex(request, reply) {
43+
await generateIndexHtml();
44+
45+
return reply.sendFile("index.html", projectRootPath);
46+
}

server/src/frameworks/frameworksServices.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import path from "path";
2-
import fs from "fs";
1+
import path from "node:path";
2+
import * as fs from "node:fs";
33

44
import { frameworksDirectory } from "../config/directories.js";
55
import { buildFrameworkVersionString, copyProps } from "./helpers/index.js";
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import * as fs from "node:fs";
2+
import path from "node:path";
3+
import { cwd } from "node:process";
4+
import ejs from "ejs";
5+
6+
import { loadFrameworkVersions } from "../frameworksServices.js";
7+
8+
const projectRootPath = path.join(cwd(), "..");
9+
10+
/**
11+
* Options for generating the index HTML page.
12+
* @typedef GenerateIndexHtmlOptions
13+
* @property {boolean} minify
14+
*/
15+
16+
/**
17+
* Generate the index HTML page.
18+
* @param {GenerateIndexHtmlOptions} options
19+
*/
20+
export async function generateIndexHtml(options = { minify: true }) {
21+
const { minify } = options;
22+
const frameworks = await loadFrameworkVersions();
23+
24+
for (const framework of frameworks) {
25+
framework.uri = `frameworks/${framework.type}/${framework.directory}${
26+
framework.customURL || ""
27+
}`;
28+
}
29+
30+
frameworks.sort((a, b) =>
31+
a.frameworkVersionString.localeCompare(b.frameworkVersionString),
32+
);
33+
34+
const templateFilePath = path.join("templates", "index.ejs");
35+
const templateContent = fs.readFileSync(templateFilePath, "utf8");
36+
37+
const renderedContent = ejs.render(templateContent, {
38+
frameworks,
39+
});
40+
41+
let outputContent = minify
42+
? renderedContent
43+
.replace(/\n/g, "")
44+
.replace(/\s+/g, " ")
45+
.replace(/(<[^>]*>)\s+/g, "$1")
46+
.replace(/\s*>\s*/g, ">") // Removes line wraps and spaces;
47+
: renderedContent;
48+
49+
fs.writeFileSync(path.resolve(projectRootPath, "index.html"), outputContent, {
50+
encoding: "utf8",
51+
});
52+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export { copyProps } from "./copyProps.js";
22
export { buildFrameworkVersionString } from "./buildFrameworkVersionString.js";
3+
export { generateIndexHtml } from "./generateIndexHtml.js";

server/src/static/staticRouter.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
import fastifyStatic from "@fastify/static";
2-
import path from "path";
3-
import { cwd } from "process";
2+
import path from "node:path";
3+
import { cwd } from "node:process";
44

55
import { isCSPEnabled } from "../csp/cspControllers.js";
66
import { frameworksDirectory } from "../config/directories.js";
7+
import { generateAndServeIndex } from "../frameworks/frameworksControllers.js";
78

89
const projectRootPath = path.join(cwd(), "..");
910

@@ -37,9 +38,8 @@ async function routes(fastify) {
3738
decorateReply: false,
3839
});
3940

40-
fastify.get("/index.html", async (_request, reply) => {
41-
return reply.sendFile("index.html", projectRootPath);
42-
});
41+
fastify.get("/", generateAndServeIndex);
42+
fastify.get("/index.html", generateAndServeIndex);
4343
}
4444

4545
export default routes;

server/templates/index.ejs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<!doctype html>
2+
<html>
3+
<head>
4+
<title>JS-Frameworks Benchmark</title>
5+
<meta charset="UTF-8" />
6+
<link href="css/bootstrap/dist/css/bootstrap.min.css" rel="stylesheet" />
7+
<link rel="stylesheet" href="css/main.css" />
8+
<meta name="viewport" content="width=device-width, initial-scale=1" />
9+
</head>
10+
11+
<body>
12+
<div class="container">
13+
<div class="panel panel-default">
14+
<div class="panel-heading">
15+
<h3 class="panel-title">Choose a framework:</h3>
16+
</div>
17+
<div class="panel-body">
18+
<ul class="nav nav-pills nav-stacked">
19+
<% frameworks.forEach(framework => { %>
20+
<li>
21+
<a href="/<%= framework.uri %>/index.html"
22+
><span
23+
class="glyphicon glyphicon-arrow-right"
24+
aria-hidden="true"
25+
></span>
26+
<%= framework.frameworkVersionString %>
27+
</a>
28+
</li>
29+
<% }); %>
30+
</ul>
31+
</div>
32+
</div>
33+
</div>
34+
</body>
35+
</html>

0 commit comments

Comments
 (0)