// Like `saltcorn run-js` but without the vm sandbox -- the supplied JS body // runs with full `require()` access so the e2e suite can drive Field / // TableConstraint / File creation. Invoked from the test runner via: // // source && node test/sc-exec.js "" const { createRequire } = require("node:module"); const path = require("node:path"); // Resolve @saltcorn/* against the Saltcorn checkout's node_modules. Node // resolves require from the script's path by default, which doesn't see // Saltcorn's deps; createRequire reroots the resolution. Layout: // / // dev-deploy/test/sc-exec.js (this file) // saltcorn/packages/saltcorn-data/ // So: up 2 to project root, then into saltcorn/packages/saltcorn-data/. const scRequire = createRequire(path.join(__dirname, "..", "..", "saltcorn", "packages", "saltcorn-data", "package.json")); const main = async () => { // Read code from stdin -- avoids shell-escape gymnastics for multi-line // bodies (notably \n which bash double-quotes pass through literally). const code = require("node:fs").readFileSync(0, "utf8"); if (!code) { console.error("usage: pipe JS code into sc-exec.js's stdin"); process.exit(2); } const Plugin = scRequire("@saltcorn/data/models/plugin"); const { init_multi_tenant } = scRequire("@saltcorn/data/db/state"); await Plugin.loadAllPlugins(); await init_multi_tenant(Plugin.loadAllPlugins, undefined, []); const Table = scRequire("@saltcorn/data/models/table"); const Field = scRequire("@saltcorn/data/models/field"); const View = scRequire("@saltcorn/data/models/view"); const Page = scRequire("@saltcorn/data/models/page"); const Trigger = scRequire("@saltcorn/data/models/trigger"); const TableConstraint = scRequire("@saltcorn/data/models/table_constraints"); const File = scRequire("@saltcorn/data/models/file"); const db = scRequire("@saltcorn/data/db"); // Build an async closure with the models + a re-rooted require in scope. // (`new Function` bodies don't inherit require from the script scope.) const fn = new Function( "Table", "Field", "View", "Page", "Trigger", "TableConstraint", "File", "db", "require", `return (async () => { ${code} })();` ); await fn(Table, Field, View, Page, Trigger, TableConstraint, File, db, scRequire); process.exit(0); }; main().catch((err) => { console.error(err && err.stack ? err.stack : err); process.exit(1); });