Skip to content

Commit 28f0d5a

Browse files
committed
Merge branch 'nakrovati-update-server'
2 parents 2cc5baa + 8e581e7 commit 28f0d5a

File tree

11 files changed

+448
-1868
lines changed

11 files changed

+448
-1868
lines changed

server/config/directories.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { join } from "path";
2+
import process from "process";
3+
4+
const isFrameworksDirectorySpecifies = process.argv.length === 3;
5+
6+
const frameworksDirectory = isFrameworksDirectorySpecifies
7+
? join(process.cwd(), "..", process.argv[2])
8+
: join(process.cwd(), "..", "frameworks");
9+
10+
if (isFrameworksDirectorySpecifies) {
11+
console.log(`Changing working directory to ${process.argv[2]}`);
12+
}
13+
14+
export { frameworksDirectory };

server/csp/cspControllers.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
let violations = [];
2+
let isCSPEnabled = false;
3+
4+
/**
5+
* @typedef {import("express").Request} Request
6+
* @typedef {import("express").Response} Response
7+
*/
8+
9+
/**
10+
* @param {Request} req
11+
* @param {Response} res
12+
*/
13+
export function getCSP(req, res) {
14+
console.log("CSP violations recorded for", violations);
15+
res.send(violations);
16+
}
17+
18+
/**
19+
* @param {Request} req
20+
* @param {Response} res
21+
*/
22+
export function addCSP(req, res) {
23+
console.log("/CSP ", req.body);
24+
const uri = req.body["csp-report"]["document-uri"];
25+
const frameworkRegEx = /((non-)?keyed\/.*?\/)/;
26+
const framework = uri.match(frameworkRegEx)[0];
27+
if (!violations.includes(framework)) {
28+
violations.push(framework);
29+
}
30+
res.sendStatus(201);
31+
}
32+
33+
/**
34+
* @param {Request} req
35+
* @param {Response} res
36+
*/
37+
export function enableCSP(req, res) {
38+
console.log("/startCSP");
39+
violations = [];
40+
isCSPEnabled = true;
41+
res.send("OK");
42+
}
43+
44+
/**
45+
* @param {Request} req
46+
* @param {Response} res
47+
*/
48+
export function disableCSP(req, res) {
49+
console.log("/endCSP");
50+
violations = [];
51+
isCSPEnabled = false;
52+
res.send("OK");
53+
}
54+
55+
export { isCSPEnabled };

server/csp/cspRouter.js

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import express from "express";
2+
import bodyParser from "body-parser";
3+
4+
import { addCSP, disableCSP, enableCSP, getCSP } from "./cspControllers.js";
5+
6+
const router = express.Router();
7+
8+
router.use("/csp", bodyParser.json({ type: "application/csp-report" }));
9+
10+
router.get("/startCSP", enableCSP);
11+
12+
router.get("/endCSP", disableCSP);
13+
14+
router.get("/csp", getCSP);
15+
16+
router.post("/csp", addCSP);
17+
18+
export default router;
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import path from "path";
2+
import fs from "fs";
3+
4+
import { frameworksDirectory } from "../config/directories.js";
5+
import isFrameworkDir from "./utils/isFrameworkDir.js";
6+
import { loadFrameworkInfo } from "./helpers/index.js";
7+
8+
export async function loadFrameworkVersionInformation(filterForFramework) {
9+
const resultsProm = [];
10+
const frameworksPath = path.resolve(frameworksDirectory);
11+
const keyedTypes = ["keyed", "non-keyed"];
12+
13+
for (const keyedType of keyedTypes) {
14+
const directories = fs.readdirSync(path.resolve(frameworksPath, keyedType));
15+
16+
for (const directory of directories) {
17+
const pathInFrameworksDir = `${keyedType}/${directory}`;
18+
19+
if (filterForFramework && filterForFramework !== pathInFrameworksDir) {
20+
continue;
21+
}
22+
23+
if (!isFrameworkDir(keyedType, directory)) {
24+
continue;
25+
}
26+
27+
const frameworkInfo = loadFrameworkInfo(keyedType, directory);
28+
resultsProm.push(frameworkInfo);
29+
}
30+
}
31+
return Promise.all(resultsProm);
32+
}

server/frameworks/frameworksRouter.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import express from "express";
2+
3+
import { loadFrameworkVersionInformation } from "./frameworksControllers.js";
4+
5+
const router = express.Router();
6+
7+
router.get("/ls", async (req, res) => {
8+
performance.mark("Start");
9+
10+
const frameworks = await loadFrameworkVersionInformation();
11+
res.send(frameworks);
12+
13+
performance.mark("End");
14+
const executionTime = performance.measure(
15+
"/ls duration measurement",
16+
"Start",
17+
"End"
18+
).duration;
19+
20+
console.log(`/ls duration: ${executionTime}ms`);
21+
});
22+
23+
export default router;

server/frameworks/helpers/index.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
import fs from "fs";
2+
import fsp from "fs/promises";
3+
import path from "path";
4+
5+
import { frameworksDirectory } from "../../config/directories.js";
6+
7+
function copyProps(result, benchmarkData) {
8+
const {
9+
issues,
10+
customURL,
11+
frameworkHomeURL,
12+
useShadowRoot,
13+
useRowShadowRoot,
14+
shadowRootName,
15+
buttonsInShadowRoot,
16+
} = benchmarkData;
17+
18+
result.issues = issues;
19+
result.customURL = customURL;
20+
result.frameworkHomeURL = frameworkHomeURL;
21+
result.useShadowRoot = useShadowRoot;
22+
result.useRowShadowRoot = useRowShadowRoot;
23+
result.shadowRootName = useShadowRoot
24+
? shadowRootName ?? "main-element"
25+
: undefined;
26+
result.buttonsInShadowRoot = useShadowRoot
27+
? buttonsInShadowRoot ?? true
28+
: undefined;
29+
}
30+
31+
export async function loadFrameworkInfo(keyedDir, directoryName) {
32+
const result = {
33+
type: keyedDir,
34+
directory: directoryName,
35+
};
36+
37+
const frameworkPath = path.resolve(
38+
frameworksDirectory,
39+
keyedDir,
40+
directoryName
41+
);
42+
const packageJSONPath = path.resolve(frameworkPath, "package.json");
43+
const packageLockJSONPath = path.resolve(frameworkPath, "package-lock.json");
44+
45+
if (!fs.existsSync(packageJSONPath)) {
46+
result.error = "No package.json found";
47+
return result;
48+
}
49+
50+
const packageJSON = JSON.parse(await fsp.readFile(packageJSONPath, "utf8"));
51+
const benchmarkData = packageJSON["js-framework-benchmark"];
52+
53+
if (!benchmarkData) {
54+
result.error =
55+
"package.json must contain a 'js-framework-benchmark' property";
56+
return result;
57+
}
58+
59+
if (benchmarkData.frameworkVersionFromPackage) {
60+
const packageNames = benchmarkData.frameworkVersionFromPackage.split(":");
61+
const packageLockJSON = JSON.parse(
62+
await fsp.readFile(packageLockJSONPath, "utf8")
63+
);
64+
65+
result.versions = {};
66+
67+
for (const packageName of packageNames) {
68+
if (packageLockJSON.dependencies?.[packageName]) {
69+
result.versions[packageName] =
70+
packageLockJSON.dependencies[packageName].version;
71+
} else if (packageLockJSON.packages?.[`node_modules/${packageName}`]) {
72+
result.versions[packageName] =
73+
packageLockJSON.packages[`node_modules/${packageName}`].version;
74+
} else {
75+
result.versions[packageName] = "ERROR: Not found in package-lock";
76+
}
77+
}
78+
79+
result.frameworkVersionString = `${directoryName}-v${packageNames
80+
.map((p) => result.versions[p])
81+
.join(" + ")}-${keyedDir}`;
82+
83+
copyProps(result, benchmarkData);
84+
} else if (typeof benchmarkData.frameworkVersion === "string") {
85+
result.version = benchmarkData.frameworkVersion;
86+
result.frameworkVersionString = `${directoryName}${
87+
result.version ? `-v${result.version}` : ""
88+
}-${keyedDir}`;
89+
90+
copyProps(result, benchmarkData);
91+
} else {
92+
result.error =
93+
"package.json must contain a 'frameworkVersionFromPackage' or 'frameworkVersion' in the 'js-framework-benchmark'.property";
94+
}
95+
96+
return result;
97+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
import fs from "fs";
2+
import path from "path";
3+
import { frameworksDirectory } from "../../config/directories.js";
4+
5+
/**
6+
* @param {string} keyedDir
7+
* @param {string} directoryName
8+
* @returns {boolean}
9+
*/
10+
function isFrameworkDir(keyedDir, directoryName) {
11+
const frameworkPath = path.resolve(
12+
frameworksDirectory,
13+
keyedDir,
14+
directoryName
15+
);
16+
const packageJSONPath = path.resolve(frameworkPath, "package.json");
17+
const packageLockJSONPath = path.resolve(frameworkPath, "package-lock.json");
18+
const exists =
19+
fs.existsSync(packageJSONPath) && fs.existsSync(packageLockJSONPath);
20+
21+
return exists;
22+
}
23+
24+
export default isFrameworkDir;

0 commit comments

Comments
 (0)