diff --git a/packages/api/src/controllers/runners.js b/packages/api/src/controllers/runners.js index 98dbf7185..a43e4d616 100644 --- a/packages/api/src/controllers/runners.js +++ b/packages/api/src/controllers/runners.js @@ -5,10 +5,19 @@ const uuidv1 = require('uuid/v1'); const byline = require('byline'); const socket = require('../utility/socket'); const { fork } = require('child_process'); -const { rundir, uploadsdir } = require('../utility/directories'); +const { rundir, uploadsdir, pluginsdir } = require('../utility/directories'); + +function extractPlugins(script) { + const requireRegex = /\s*\/\/\s*@require\s+([^\s]+)\s*\n/g; + const matches = [...script.matchAll(requireRegex)]; + return matches.map((x) => x[1]); +} const scriptTemplate = (script) => ` -const dbgateApi = require(process.env.DBGATE_API || "dbgate-api"); +const dbgateApi = require(process.env.DBGATE_API); +${extractPlugins(script) + .map((packageName) => `const ${_.camelCase(packageName)} = require(process.env.PLUGIN_${_.camelCase(packageName)});\n`) + .join('')} require=null; async function run() { ${script} @@ -19,7 +28,7 @@ dbgateApi.runScript(run); `; const loaderScriptTemplate = (functionName, props, runid) => ` -const dbgateApi = require(process.env.DBGATE_API || "dbgate-api"); +const dbgateApi = require(process.env.DBGATE_API); require=null; async function run() { const reader=await dbgateApi.${functionName}(${JSON.stringify(props)}); @@ -73,12 +82,14 @@ module.exports = { const scriptFile = path.join(uploadsdir(), runid + '.js'); fs.writeFileSync(`${scriptFile}`, scriptText); fs.mkdirSync(directory); + const pluginNames = fs.readdirSync(pluginsdir()); console.log(`RUNNING SCRIPT ${scriptFile}`); const subprocess = fork(scriptFile, ['--checkParent'], { cwd: directory, stdio: ['ignore', 'pipe', 'pipe', 'ipc'], env: { DBGATE_API: process.argv[1], + ..._.fromPairs(pluginNames.map((name) => [`PLUGIN_${_.camelCase(name)}`, path.join(pluginsdir(), name)])), }, }); const pipeDispatcher = (severity) => (data) => @@ -153,4 +164,3 @@ module.exports = { return promise; }, }; - diff --git a/packages/web/src/impexp/ScriptWriter.js b/packages/web/src/impexp/ScriptWriter.js index cf459d2e6..84311e38a 100644 --- a/packages/web/src/impexp/ScriptWriter.js +++ b/packages/web/src/impexp/ScriptWriter.js @@ -1,6 +1,10 @@ +import _ from 'lodash'; + export default class ScriptWriter { constructor() { this.s = ''; + this.packageNames = []; + this.engines = []; this.varCount = 0; } @@ -15,7 +19,21 @@ export default class ScriptWriter { } assign(variableName, functionName, props) { - this.put(`const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`); + const nsMatch = functionName.match(/^([^@]+)@([^@]+)/); + if (nsMatch) { + const packageName = nsMatch[2]; + if (!this.packageNames.includes(packageName)) { + this.packageNames.push(packageName); + } + this.put( + `const ${variableName} = await ${_.camelCase(packageName)}.shellApi.${nsMatch[1]}(${JSON.stringify(props)});` + ); + } else { + this.put(`const ${variableName} = await dbgateApi.${functionName}(${JSON.stringify(props)});`); + } + if (props && props.connection && props.connection.engine && !this.engines.includes(props.connection.engine)) { + this.engines.push(props.connection.engine); + } } copyStream(sourceVar, targetVar) { @@ -25,4 +43,17 @@ export default class ScriptWriter { comment(s) { this.put(`// ${s}`); } + + getScript(extensions) { + // if (this.packageNames.length > 0) { + // this.comment('@packages'); + // this.comment(JSON.stringify(this.packageNames)); + // } + // if (this.engines.length > 0) { + // this.comment('@engines'); + // this.comment(JSON.stringify(this.engines)); + // } + const packageNames = this.packageNames; + return packageNames.map((packageName) => `// @require ${packageName}\n`).join('') + '\n' + this.s; + } } diff --git a/packages/web/src/impexp/createImpExpScript.js b/packages/web/src/impexp/createImpExpScript.js index d5826d4c3..e9752c221 100644 --- a/packages/web/src/impexp/createImpExpScript.js +++ b/packages/web/src/impexp/createImpExpScript.js @@ -181,7 +181,7 @@ export default async function createImpExpScript(extensions, values, addEditorIn script.comment('@ImportExportConfigurator'); script.comment(JSON.stringify(values)); } - return script.s; + return script.getScript(extensions); } export function getActionOptions(extensions, source, values, targetDbinfo) {