generate-types.cjs 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. const config = require('../src/config.json');
  2. const path = require('path');
  3. const fs = require('fs');
  4. const sourceDir = path.resolve(__dirname, './../tsc/type/src/packages'); // 拷贝的源文件夹
  5. const toDir = path.resolve(__dirname, './../dist/types'); // ./../dist
  6. if(fs.existsSync(toDir)) {
  7. fs.rmdirSync(toDir); //先删除文件夹
  8. }
  9. const basePath = path.join(toDir, '__VUE');
  10. const fileList = [];
  11. let packages = [];
  12. const preContent = `
  13. declare type Install<T> = T & {
  14. install(app: import('vue').App): void;
  15. };\n`;
  16. const start = 'declare const _default:';
  17. const end = ';\nexport default _default;\n';
  18. const regex = new RegExp(`${start}([\\s\\S]*?)${end}`);
  19. const getCompList = (basePath) => {
  20. const files = fs.readdirSync(basePath);
  21. files.forEach((filename) => {
  22. const filedir = path.join(basePath, filename);
  23. //根据文件路径获取文件信息,返回一个fs.Stats对象
  24. const stats = fs.statSync(filedir);
  25. const isFile = stats.isFile();//是文件
  26. const isDir = stats.isDirectory();//是文件夹
  27. if(isFile){
  28. fileList.push(filedir);
  29. }
  30. if(isDir){
  31. getCompList(filedir);//递归,如果是文件夹,就继续遍历该文件夹下面的文件
  32. }
  33. });
  34. }
  35. const getCompName = (name) => {
  36. if(!packages.length) {
  37. config.nav.forEach((item, index) => {
  38. packages = packages.concat(item.packages);
  39. });
  40. }
  41. const packageName = packages.find((item) => item.name.toLowerCase() === name.toLowerCase());
  42. return packageName ? packageName.name : ''
  43. }
  44. const getLocale = () => {
  45. const source = path.join(sourceDir, 'locale');
  46. const to = path.resolve(__dirname, './../dist/packages/locale');
  47. fs.cp(source, to, { recursive: true }, (err) => {
  48. if(err) {
  49. console.error(err);
  50. return;
  51. }
  52. })
  53. }
  54. fs.cp(sourceDir, toDir, { recursive: true }, (err) => {
  55. if(err) {
  56. console.error(err);
  57. return;
  58. }
  59. const oldName = path.join(toDir, 'nutui.vue.build.d.ts');
  60. const newName = path.join(toDir, 'index.d.ts');
  61. fs.rename(oldName, newName, (err) => {
  62. if(err) {
  63. console.error(err);
  64. }
  65. })
  66. getCompList(basePath);
  67. fileList.forEach((item, index) => {
  68. const content = fs.readFileSync(item).toLocaleString();
  69. const inputs = content.match(regex);
  70. if(inputs && inputs.length) {
  71. let name = item.substring(0, item.lastIndexOf('/'));
  72. name = name.substring(name.lastIndexOf('/') + 1);
  73. const componentName = getCompName(name);
  74. if(componentName) {
  75. let remain = `
  76. declare module 'vue' {
  77. interface GlobalComponents {
  78. Nut${componentName}: typeof _default;
  79. }
  80. }`;
  81. let changeContent = content.replace(regex, `${preContent}${start} Install<${inputs[1]}>${end}${remain}`)
  82. fs.writeFileSync(item, changeContent);
  83. }
  84. }
  85. });
  86. //国际化处理
  87. getLocale();
  88. });