generate-types-taro.cjs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. const getResolver = () => {
  52. const source = path.join(sourceDir, 'resolver');
  53. const to = path.resolve(__dirname, './../dist/resolver');
  54. fs.cp(source, to, { recursive: true }, (err) => {
  55. if(err) {
  56. console.error(err);
  57. return;
  58. }
  59. })
  60. }
  61. fs.cp(sourceDir, toDir, { recursive: true }, (err) => {
  62. if(err) {
  63. console.error(err);
  64. return;
  65. }
  66. const oldName = path.join(toDir, 'nutui.taro.vue.build.d.ts');
  67. const newName = path.join(toDir, 'index.d.ts');
  68. fs.rename(oldName, newName, (err) => {
  69. if(err) {
  70. console.error(err);
  71. }
  72. })
  73. getCompList(basePath);
  74. fileList.forEach((item, index) => {
  75. const content = fs.readFileSync(item).toLocaleString();
  76. const inputs = content.match(regex);
  77. if(inputs && inputs.length) {
  78. let name = item.substring(0, item.lastIndexOf('/'));
  79. name = name.substring(name.lastIndexOf('/') + 1);
  80. const componentName = getCompName(name);
  81. if(componentName) {
  82. let remain = `
  83. declare module 'vue' {
  84. interface GlobalComponents {
  85. Nut${componentName}: typeof _default;
  86. }
  87. }`;
  88. let changeContent = content.replace(regex, `${preContent}${start} Install<${inputs[1]}>${end}${remain}`)
  89. fs.writeFileSync(item, changeContent);
  90. }
  91. }
  92. });
  93. //国际化处理
  94. getLocale();
  95. // resolver 类型文件
  96. getResolver();
  97. });