Files
directus/api/src/operations/exec/index.ts
Rijk van Zanten 80f4807a09 TS Config Modernization Program Part 3 of many (#17904)
* noImplicitOverride: true

* noImplicitReturns: true

* noPropertyAccessFromIndexSignature: true
2023-03-23 16:47:55 -04:00

49 lines
1.1 KiB
TypeScript

import { defineOperationApi, toArray } from '@directus/shared/utils';
import { NodeVM, NodeVMOptions, VMScript } from 'vm2';
import { isBuiltin } from 'node:module';
type Options = {
code: string;
};
export default defineOperationApi<Options>({
id: 'exec',
handler: async ({ code }, { data, env }) => {
const allowedModules = env['FLOWS_EXEC_ALLOWED_MODULES'] ? toArray(env['FLOWS_EXEC_ALLOWED_MODULES']) : [];
const allowedModulesBuiltIn: string[] = [];
const allowedModulesExternal: string[] = [];
const allowedEnv = data['$env'] ?? {};
const opts: NodeVMOptions = {
eval: false,
wasm: false,
env: allowedEnv,
};
for (const module of allowedModules) {
if (isBuiltin(module)) {
allowedModulesBuiltIn.push(module);
} else {
allowedModulesExternal.push(module);
}
}
if (allowedModules.length > 0) {
opts.require = {
builtin: allowedModulesBuiltIn,
external: {
modules: allowedModulesExternal,
transitive: false,
},
};
}
const vm = new NodeVM(opts);
const script = new VMScript(code).compile();
const fn = await vm.run(script);
return await fn(data);
},
});