generate-types-taro.cjs 3.3 KB

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