generate-unplugin-deps.cjs 3.6 KB

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