const path = require('path'); const fs = require('fs'); const ROOT_DIR = process.cwd(); // Tool function aa-bb-cc - > AaBbCc const getPascalName = name => name .split('-') .map(s => s.slice(0, 1).toUpperCase() + s.slice(1)) .join(''); // Tool function aa-bb-cc - > aaBbCc const getCamelName = name => name .split('-') .map((s, i) => (i === 0 ? s : s.slice(0, 1).toUpperCase() + s.slice(1))) .join(''); // Tool function aa-bb-cc - > AA_BB_CC const getConstantName = name => name .split('-') .map(s => s.toUpperCase()) .join('_'); module.exports = plop => { // Register a new action to add new node registration information in the export and registration files plop.setActionType('registryNode', async answers => { const { name, pascalName, supportTest } = answers; const constantName = getConstantName(name); const registryName = `${constantName}_NODE_REGISTRY`; // Modify the export file const nodeExportFilePath = './src/node-registries/index.ts'; const nodeContent = fs.readFileSync(nodeExportFilePath, 'utf8'); const nodeContentNew = nodeContent.replace( '// cli 脚本插入标识(registry),请勿修改/删除此行注释', `export { ${registryName} } from './${name}'; // The cli script inserts the identifier (registry), please do not modify/delete this line comment `, ); fs.writeFileSync(nodeExportFilePath, nodeContentNew, 'utf8'); // Modify registration documents const nodeRegistryFilePath = './src/nodes-v2/constants.ts'; const nodeRegistryContent = fs.readFileSync(nodeRegistryFilePath, 'utf8'); const nodeRegistryContentNew = nodeRegistryContent .replace( '// cli 脚本插入标识(import),请勿修改/删除此行注释', `${registryName}, // The cli script inserts the identity (import), please do not modify/delete this line comment `, ) .replace( '// cli 脚本插入标识(registry),请勿修改/删除此行注释', `// cli 脚本插入标识(registry),请勿修改/删除此行注释 ${registryName},`, ); fs.writeFileSync(nodeRegistryFilePath, nodeRegistryContentNew, 'utf8'); // Modify the node-content registration file const nodeContentRegistryFilePath = './src/components/node-render/node-render-new/content/index.tsx'; const nodeContentRegistryContent = fs.readFileSync( nodeContentRegistryFilePath, 'utf8', ); const nodeContentRegistryContentNew = nodeContentRegistryContent .replace( '// cli 脚本插入标识(import),请勿修改/删除此行注释', `import { ${pascalName}Content } from '@/node-registries/${name}'; // The cli script inserts the identity (import), please do not modify/delete this line comment `, ) .replace( '// cli 脚本插入标识(registry),请勿修改/删除此行注释', `[StandardNodeType.${pascalName}]: ${pascalName}Content, // The cli script inserts the identifier (registry), please do not modify/delete this line comment `, ); fs.writeFileSync( nodeContentRegistryFilePath, nodeContentRegistryContentNew, 'utf8', ); // If the node does not need to support single-node testing, delete the node-test file const testFilePath = path.resolve( ROOT_DIR, `./src/node-registries/${name}/node-test.ts`, ); if (!supportTest && fs.existsSync(testFilePath)) { fs.unlinkSync(testFilePath); } return `节点 ${name} 已注册`; }); // Register a new generator for creating new node directories and files plop.setGenerator('create node', { description: 'generate template', prompts: [ { type: 'input', name: 'name', message: '请输入组件名称,以"-"(空格)分隔,用于生成目录名称, eg: "database-create"', }, { type: 'input', name: 'pascalName', message: '请确认大写驼峰命名,用于类名,注意特殊命名: http -> HTTP ,而不是 http -> Http: ', default: answers => getPascalName(answers.name), }, { type: 'input', name: 'camelName', message: '请确认小写驼峰命名,用于变量前缀,注意特殊命名: my-ai -> myAI,而不是 my-ai -> myAi: ', default: answers => getCamelName(answers.name), }, { type: 'confirm', name: 'supportTest', message: '是否支持单节点测试?', default: false, }, ], actions: data => { const { name, pascalName, camelName, supportTest } = data; const constantName = getConstantName(data.name); const actions = [ { type: 'addMany', destination: path.resolve(ROOT_DIR, `./src/node-registries/${name}`), templateFiles: 'templates', data: { PASCAL_NAME_PLACE_HOLDER: pascalName, CAMEL_NAME_PLACE_HOLDER: camelName, CONSTANT_NAME_PLACE_HOLDER: constantName, SUPPORT_TEST: supportTest, }, }, { type: 'registryNode', }, ]; return actions; }, }); };