generate-style-deps.cjs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. const config = require('../src/config.json');
  2. const path = require('path');
  3. const fs = require('fs-extra');
  4. // 获取依赖关系
  5. const styleMap = new Map();
  6. const tasks = [];
  7. let outputFileEntry = ``;
  8. // import Locale from './packages/locale';\n
  9. config.nav.forEach((item) => {
  10. item.packages.forEach((element) => {
  11. styleMap.set(element.name, {
  12. name: element.name,
  13. children: element.styleDeps
  14. });
  15. // gen entry
  16. if (element.exclude != true) {
  17. const outputMjs = `import ${element.name} from '../_es/${element.name}.js';\nexport { ${element.name} };`;
  18. tasks.push(
  19. fs.outputFile(path.resolve(__dirname, `../dist/packages/${element.name}/index.mjs`), outputMjs, 'utf8', () => {
  20. // console.log('')
  21. })
  22. );
  23. outputFileEntry += `export * from "./packages/${element.name}/index.mjs";\n`;
  24. }
  25. });
  26. });
  27. tasks.push(
  28. fs.outputFile(path.resolve(__dirname, `../dist/nutui.es.js`), outputFileEntry, 'utf8', () => {
  29. // console.log('')
  30. })
  31. );
  32. styleMap.forEach((value) => {
  33. if (value.children && value.children.length > 0) {
  34. value.children.forEach((item, index) => {
  35. value.children[index] = styleMap.get(item);
  36. });
  37. }
  38. });
  39. const getAllDeps = (styleObj, key) => {
  40. const value = styleObj;
  41. if (value.children?.length === 0) {
  42. return [value.name];
  43. } else {
  44. let deps = [];
  45. value.children?.forEach((item) => {
  46. if (key === item.name) {
  47. console.error('generate-style-deps: 存在循环引用', key);
  48. return [];
  49. }
  50. deps = deps.concat(getAllDeps(item, key));
  51. });
  52. deps.unshift(value.name);
  53. return [...new Set(deps)];
  54. }
  55. };
  56. styleMap.forEach((value, key) => {
  57. const name = key.toLowerCase();
  58. let deps = getAllDeps(value, key);
  59. deps = deps.filter((component) => {
  60. return component !== key;
  61. });
  62. // gen style
  63. const outputStyleCJs = `require('./index.scss');\n${deps
  64. .map((component) => {
  65. return `require('../${component.toLowerCase()}/index.scss');\n`;
  66. })
  67. .join('')}`;
  68. const outputStyleMjs = `import './index.scss';\n${deps
  69. .map((component) => {
  70. return `import '../${component.toLowerCase()}/index.scss';\n`;
  71. })
  72. .join('')}`;
  73. tasks.push(
  74. fs.outputFile(path.resolve(__dirname, `../dist/packages/${name}/style.cjs`), outputStyleCJs, 'utf8', () => {
  75. // console.log('')
  76. })
  77. );
  78. tasks.push(
  79. fs.outputFile(path.resolve(__dirname, `../dist/packages/${name}/style.mjs`), outputStyleMjs, 'utf8', () => {
  80. // console.log('')
  81. })
  82. );
  83. });
  84. Promise.all(tasks);