@directus/api
Version:
Directus is a real-time API and App dashboard for managing SQL database content
81 lines (72 loc) • 3.13 kB
JavaScript
import { numberGenerator } from '@directus/utils';
import { generateHostFunctionReference } from './generate-host-function-reference.js';
import { registerActionGenerator, registerFilterGenerator, registerOperationGenerator, registerRouteGenerator, } from './register/index.js';
/**
* Generate the JS to run in the isolate to create the extension's entrypoint to the host
*
* @param type - Extension type to generate the entrypoint for
* @param name - Unique name of the extension
* @param endpointRouter - Scoped express router to register endpoint extension in
*/
export function generateApiExtensionsSandboxEntrypoint(type, name, endpointRouter) {
const index = numberGenerator();
const hostFunctions = [];
const extensionExport = `const extensionExport = $${index.next().value}.deref();`;
if (type === 'hook') {
const code = `
${extensionExport}
const filter = ${generateHostFunctionReference(index, ['event', 'handler'], { async: false })}
const action = ${generateHostFunctionReference(index, ['event', 'handler'], { async: false })}
return extensionExport({ filter, action });
`;
const { register: filter, unregisterFunctions: filterUnregisterFunctions } = registerFilterGenerator();
const { register: action, unregisterFunctions: actionUnregisterFunctions } = registerActionGenerator();
hostFunctions.push(filter);
hostFunctions.push(action);
const unregisterFunction = async () => {
await Promise.all([...filterUnregisterFunctions, ...actionUnregisterFunctions].map((fn) => fn()));
};
return { code, hostFunctions, unregisterFunction };
}
else if (type === 'endpoint') {
const code = `
${extensionExport}
const registerRoute = ${generateHostFunctionReference(index, ['path', 'method', 'handler'], { async: false })}
const router = {
get: (path, handler) => {
registerRoute(path, 'GET', handler);
},
post: (path, handler) => {
registerRoute(path, 'POST', handler);
},
put: (path, handler) => {
registerRoute(path, 'PUT', handler);
},
patch: (path, handler) => {
registerRoute(path, 'PATCH', handler);
},
delete: (path, handler) => {
registerRoute(path, 'DELETE', handler);
}
};
return extensionExport(router);
`;
const { register, unregisterFunction } = registerRouteGenerator(name, endpointRouter);
hostFunctions.push(register);
return { code, hostFunctions, unregisterFunction };
}
else {
const code = `
${extensionExport}
const registerOperation = ${generateHostFunctionReference(index, ['id', 'handler'], { async: false })}
const operationConfig = extensionExport;
registerOperation(operationConfig.id, operationConfig.handler);
`;
const { register, unregisterFunctions } = registerOperationGenerator();
hostFunctions.push(register);
const unregisterFunction = async () => {
await Promise.all(unregisterFunctions.map((fn) => fn()));
};
return { code, hostFunctions, unregisterFunction };
}
}