// SPDX-License-Identifier: LGPL-2.1-or-later const crypto = require("crypto"); const fs = require("fs"); const path = require("path"); const vm = require("vm"); const sampleDirectory = path.resolve(process.argv[2] || "FreeCAD/docs/plugin-sample"); const expectedApiVersion = "1"; function digest(buffer) { return crypto.createHash("sha256").update(buffer).digest("hex"); } function validatePackage(directory, manifestOverride) { const manifest = manifestOverride || JSON.parse(fs.readFileSync(path.join(directory, "manifest.json"), "utf8")); if (manifest.schema !== "freecad-web-plugin/v1" || manifest.apiVersion !== expectedApiVersion || !/^[a-z0-9-]+$/.test(manifest.id) || manifest.entry !== "plugin.js") { throw new Error("PLUGIN_MANIFEST_INVALID"); } const entryPath = path.join(directory, manifest.entry); const source = fs.readFileSync(entryPath); if (digest(source) !== manifest.sha256) { throw new Error("PLUGIN_HASH_MISMATCH"); } const context = vm.createContext({module: {exports: {}}, exports: {}, require: undefined, process: undefined, globalThis: {}}); new vm.Script(source.toString("utf8"), {filename: entryPath}).runInContext(context, {timeout: 100}); const exported = context.module.exports; if (!exported || typeof exported.register !== "function") { throw new Error("PLUGIN_ENTRY_INVALID"); } const result = exported.register({apiVersion: expectedApiVersion}); return {manifest, result}; } const valid = validatePackage(sampleDirectory); let wrongHash = "none"; try { validatePackage(sampleDirectory, {...valid.manifest, sha256: "0".repeat(64)}); } catch (error) { wrongHash = error.message; } let wrongVersion = "none"; try { validatePackage(sampleDirectory, {...valid.manifest, apiVersion: "999"}); } catch (error) { wrongVersion = error.message; } const result = {valid: {id: valid.result.id, commands: valid.result.commands, apiVersion: valid.result.apiVersion}, wrongHash, wrongVersion}; if (result.valid.id !== "freecad-web-part-sample" || result.valid.commands.join(",") !== "box" || result.valid.apiVersion !== "1" || result.wrongHash !== "PLUGIN_HASH_MISMATCH" || result.wrongVersion !== "PLUGIN_MANIFEST_INVALID") { throw new Error(JSON.stringify(result)); } console.log(JSON.stringify(result));