generate-unplugin-deps.cjs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. const config = require('../src/config.json');
  2. const packageConfig = require('../package.json');
  3. const path = require('path');
  4. const fs = require('fs-extra');
  5. // 获取依赖关系
  6. const styleMap = new Map();
  7. const tasks = [];
  8. let outputFileEntry = ``;
  9. let components = [];
  10. // import Locale from './packages/locale';\n
  11. config.nav.forEach((item) => {
  12. item.packages.forEach((element) => {
  13. styleMap.set(element.name, {
  14. name: element.name,
  15. children: element.styleDeps
  16. });
  17. // gen entry
  18. if (element.exclude != true) {
  19. let outputMjs = '';
  20. if (element.type == 'methods') {
  21. outputMjs = `import _${element.name} from '../_es/${element.name}.js';
  22. import { show${element.name} } from '../_es/${element.name}.js';
  23. const treeshaking = (t) => t;
  24. const ${element.name} = treeshaking(_${element.name});
  25. export { ${element.name}, show${element.name} };`;
  26. } else {
  27. outputMjs = `import _${element.name} from '../_es/${element.name}.js';
  28. const treeshaking = (t) => t;
  29. const ${element.name} = treeshaking(_${element.name});
  30. export { ${element.name} };`;
  31. }
  32. tasks.push(
  33. fs.outputFile(path.resolve(__dirname, `../dist/packages/${element.name}/index.mjs`), outputMjs, 'utf8', () => {
  34. // console.log('')
  35. })
  36. );
  37. let folderName = element.name.toLowerCase();
  38. outputFileEntry += `export * from "./packages/${folderName}/index.mjs";\n`;
  39. components.push(element.name);
  40. }
  41. });
  42. });
  43. outputFileEntry += components.map(name => `import { ${name} } from "./packages/${name}/index.mjs";`).join('\n');
  44. outputFileEntry += `\nimport { Locale } from "./packages/locale/lang";
  45. function install(app) {
  46. const packages = [${components.join(',')}];
  47. packages.forEach((item) => {
  48. if (item.install) {
  49. app.use(item);
  50. } else if (item.name) {
  51. app.component(item.name, item);
  52. }
  53. });
  54. }
  55. const version = '${packageConfig.version}';
  56. var stdin_default = {
  57. install,
  58. version,
  59. Locale
  60. };
  61. export {
  62. stdin_default as default,
  63. install,
  64. version,
  65. Locale
  66. };`;
  67. tasks.push(
  68. fs.outputFile(path.resolve(__dirname, `../dist/nutui.es.js`), outputFileEntry, 'utf8', () => {
  69. // console.log('')
  70. })
  71. );
  72. styleMap.forEach((value) => {
  73. if (value.children && value.children.length > 0) {
  74. value.children.forEach((item, index) => {
  75. value.children[index] = styleMap.get(item);
  76. });
  77. }
  78. });
  79. const getAllDeps = (styleObj, key) => {
  80. const value = styleObj;
  81. if (value.children?.length === 0) {
  82. return [value.name];
  83. } else {
  84. let deps = [];
  85. value.children?.forEach((item) => {
  86. if (key === item.name) {
  87. console.error('generate-style-deps: 存在循环引用', key);
  88. return [];
  89. }
  90. deps = deps.concat(getAllDeps(item, key));
  91. });
  92. deps.unshift(value.name);
  93. return [...new Set(deps)];
  94. }
  95. };
  96. styleMap.forEach((value, key) => {
  97. const name = key.toLowerCase();
  98. let deps = getAllDeps(value, key);
  99. deps = deps.filter((component) => {
  100. return component !== key;
  101. });
  102. // gen style
  103. const outputStyleCJs = `${deps
  104. .map((component) => {
  105. return `require('../${component.toLowerCase()}/index.scss');\n`;
  106. })
  107. .reverse()
  108. .join('')}require('./index.scss');\n`;
  109. const outputStyleMjs = `${deps
  110. .map((component) => {
  111. return `import '../${component.toLowerCase()}/index.scss';\n`;
  112. })
  113. .reverse()
  114. .join('')}import './index.scss';\n`;
  115. tasks.push(
  116. fs.outputFile(path.resolve(__dirname, `../dist/packages/${name}/style.cjs`), outputStyleCJs, 'utf8', () => {
  117. // console.log('')
  118. })
  119. );
  120. tasks.push(
  121. fs.outputFile(path.resolve(__dirname, `../dist/packages/${name}/style.mjs`), outputStyleMjs, 'utf8', () => {
  122. // console.log('')
  123. })
  124. );
  125. });
  126. Promise.all(tasks);