@swell/cli
Version:
Swell's command line interface/utility
84 lines (80 loc) • 2.34 kB
JavaScript
export function getFunctionTemplate({ description, events, extension, functionName, language, route, schedule, trigger, }) {
if (trigger === 'workflow') {
return getWorkflowTemplate({
description,
functionName,
language,
});
}
let typeAppend = '';
if (trigger === 'model') {
const eventsList = events
.split(/\s*,\s*/g)
.filter(Boolean)
.map((eventName) => `'${eventName}'`)
.join(', ');
typeAppend = `,
model: {
events: [${eventsList}],
conditions: {},
},`;
}
if (trigger === 'route') {
typeAppend = `,
route: {
public: ${route === 'public' || !route ? 'true' : 'false'}
},`;
}
if (trigger === 'cron') {
typeAppend = `,
cron: {
schedule: '${schedule}',
},`;
}
let extensionAppend = '';
if (extension) {
extensionAppend = `extension: '${extension}',\n `;
}
return `export const config${language === 'ts' ? ': SwellConfig' : ''} = {
${extensionAppend}description: '${description}'${typeAppend}
};
export default async function (req${language === 'ts' ? ': SwellRequest' : ''}) {
const { swell, store, data } = req;
}
`;
}
function getWorkflowTemplate({ description, functionName, language, }) {
const className = toWorkflowClassName(functionName);
const reqParam = language === 'ts' ? 'req: SwellWorkflowRequest' : 'req';
const stepParam = language === 'ts' ? 'step: SwellWorkflowStep' : 'step';
return `export const config = {
kind: 'workflow',
description: '${description}'
};
export default class ${className} {
async run(${reqParam}, ${stepParam}) {
await step.do('load settings', async () => {
await req.swell.settings();
});
return {
data: req.data,
};
}
}
`;
}
function toWorkflowClassName(functionName) {
const baseName = functionName
.split(/[/\\]/)
.pop()
?.replace(/\.[cm]?[jt]sx?$/i, '');
const className = (baseName || 'workflow')
.split(/[^\dA-Za-z]+/g)
.filter(Boolean)
.map((part) => `${part[0]?.toUpperCase() || ''}${part.slice(1)}`)
.join('');
if (!className) {
return 'Workflow';
}
return /^[$A-Z_a-z]/.test(className) ? className : `Workflow${className}`;
}