const fs = require('fs'); const child_process = require('child_process'); var importStr = ''; var interfaceStr = `\ninterface uc extends UiClass { uiComponent: T; }`; var root = './assets/src/game'; var obj = {}; function loopDir(dir) { let files = fs.readdirSync(dir); files.forEach(file => { if (fs.statSync(dir + '/' + file).isDirectory()) { loopDir(dir + '/' + file); } else { if (file.indexOf('.meta') == -1 && file.indexOf('.ts') != -1) { readTs(dir + '/' + file); } } }); } function readTs(file) { let str = fs.readFileSync(file, 'utf-8'); let uiComponent = str.match(/\export class.*?\extends UiComponent/g); let uiClass = str.match(/\export class.*?\extends UiClass/g); if (!uiComponent && !uiClass) return; let uiComponentName; let uiClassName; let arr = []; if (uiComponent) { uiComponentName = uiComponent[0].split(' ')[2]; arr.push(uiComponentName); } if (uiClass) { uiClassName = uiClass[0].split(' ')[2]; arr.push(uiClassName); } importStr += `import { ${arr.join(', ')} } from '${file.replace('.ts', '')}';\n`; if (uiComponentName && !uiClassName && str.match(/new UiClass.*\'/gi)) { let ptl = str.match(/new UiClass.*\'/gi); let name = ptl[0].split(',')[2]?.trim().replaceAll(`"`, '').replaceAll(`'`, ''); if (name) { obj[name] = `uc<${uiComponentName}>`; } } if (uiClassName) { let ptl = str.match(/new .*\'/gi); if (ptl) { ptl = ptl.filter(v => v.indexOf('new ' + uiClassName) != -1)[0]; if (!ptl) { return; } let uClassName = ptl.split(',')[1]?.trim(); if (!uClassName) return; let name = ptl.split(',')[2].trim().replaceAll(`"`, '').replaceAll(`'`, ''); interfaceStr += `\ninterface ${'_' + uiClassName} extends ${uiClassName} {`; interfaceStr += `\n uiComponent: ${uClassName};`; interfaceStr += `\n}`; obj[name] = '_' + uiClassName; } } // console.log(uiComponentName, uiClassName); } loopDir(root); let ts = importStr + interfaceStr + '\n'; ts += '\ndeclare global {'; ts += '\n interface UiList {'; for (let name in obj) { ts += `\n ${name}: ${obj[name]};`; } ts += '\n }'; ts += '\n}'; child_process.execSync('svn up type_ui.d.ts'); fs.writeFileSync('type_ui.d.ts', ts); child_process.execSync('svn ci -m 自动提交UiClass提示文件 type_ui.d.ts');