@nodecg/types
Version:
Dynamic broadcast graphics rendered in a browser
81 lines (64 loc) • 2.32 kB
text/typescript
import * as fs from "fs";
import * as path from "path";
import type { NodeCG } from "../../types/nodecg";
export function parseGraphics(
graphicsDir: string,
manifest: NodeCG.Manifest,
): NodeCG.Bundle.Graphic[] {
const graphics: NodeCG.Bundle.Graphic[] = [];
if (fs.existsSync(graphicsDir) && typeof manifest.graphics === "undefined") {
// If the graphics folder exists but the nodecg.graphics property doesn't, throw an error.
throw new Error(
`${manifest.name} has a "graphics" folder, ` +
'but no "nodecg.graphics" property was found in its package.json',
);
}
// If nodecg.graphics exists but the graphics folder doesn't, throw an error.
if (!fs.existsSync(graphicsDir) && typeof manifest.graphics !== "undefined") {
throw new Error(
`${manifest.name} has a "nodecg.graphics" property in its package.json, but no "graphics" folder`,
);
}
// If neither the folder nor the manifest exist, return an empty array.
if (!fs.existsSync(graphicsDir) && typeof manifest.graphics === "undefined") {
return graphics;
}
if (!manifest.graphics) {
return graphics;
}
manifest.graphics.forEach((graphic, index) => {
const missingProps = [];
if (typeof graphic.file === "undefined") {
missingProps.push("file");
}
if (typeof graphic.width === "undefined") {
missingProps.push("width");
}
if (typeof graphic.height === "undefined") {
missingProps.push("height");
}
if (missingProps.length) {
throw new Error(
`Graphic #${index} could not be parsed as it is missing the following properties: ` +
missingProps.join(", "),
);
}
// Check if this bundle already has a graphic for this file
const dupeFound = graphics.some((g) => g.file === graphic.file);
if (dupeFound) {
throw new Error(
`Graphic #${index} (${graphic.file}) has the same file as another graphic in ${manifest.name}`,
);
}
const filePath = path.join(graphicsDir, graphic.file);
// Check that the panel file exists, throws error if it doesn't
fs.accessSync(filePath, fs.constants.F_OK | fs.constants.R_OK);
const parsedGraphic: NodeCG.Bundle.Graphic = {
...graphic,
singleInstance: Boolean(graphic.singleInstance),
url: `/bundles/${manifest.name}/graphics/${graphic.file}`,
};
graphics.push(parsedGraphic);
});
return graphics;
}