generate-types-taro.cjs 2.7 KB

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