You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

140 lines
3.4 KiB

  1. let path = require("path");
  2. let fs = require("fs");
  3. let glob = require("fast-glob");
  4. let esbuild = require("esbuild");
  5. let html_plugin = require("./esbuild-plugin-html");
  6. let vue = require("esbuild-vue");
  7. let postCssPlugin = require("esbuild-plugin-postcss2").default;
  8. let ignore_assets = require("./ignore-assets");
  9. let sass_options = require("./sass_options");
  10. let {
  11. app_list,
  12. get_app_path,
  13. get_public_path,
  14. run_serially,
  15. bench_path,
  16. get_cli_arg
  17. } = require("./utils");
  18. const TOTAL_BUILD_TIME = "Total Build Time";
  19. const WATCH_MODE = get_cli_arg("watch");
  20. const NODE_PATHS = [].concat(
  21. // node_modules of apps directly importable
  22. app_list
  23. .map(app => path.resolve(get_app_path(app), "../node_modules"))
  24. .filter(fs.existsSync),
  25. // import js file of any app if you provide the full path
  26. app_list
  27. .map(app => path.resolve(get_app_path(app), ".."))
  28. .filter(fs.existsSync)
  29. );
  30. (async function() {
  31. console.time(TOTAL_BUILD_TIME);
  32. await run_build_for_apps(app_list);
  33. console.timeEnd(TOTAL_BUILD_TIME);
  34. })();
  35. function run_build_for_apps(apps) {
  36. return run_serially(apps.map(app => () => run_build_for_app(app)));
  37. }
  38. function run_build_for_app(app) {
  39. let public_path = get_public_path(app);
  40. let include_patterns = path.resolve(
  41. public_path,
  42. "**",
  43. "*.bundle.{js,ts,css,sass,scss,less,styl}"
  44. );
  45. let ignore_patterns = [
  46. path.resolve(public_path, "node_modules"),
  47. path.resolve(public_path, "dist")
  48. ];
  49. return glob(include_patterns, { ignore: ignore_patterns }).then(files => {
  50. // console.log(`\nBuilding assets for ${app}...`);
  51. let dist_path = path.resolve(public_path, "dist");
  52. let file_map = {};
  53. for (let file of files) {
  54. let extension = path.extname(file);
  55. let output_name = path.basename(file, extension);
  56. if (
  57. [".css", ".scss", ".less", ".sass", ".styl"].includes(extension)
  58. ) {
  59. output_name = path.join("css", output_name);
  60. } else if ([".js", ".ts"].includes(extension)) {
  61. output_name = path.join("js", output_name);
  62. }
  63. if (Object.keys(file_map).includes(output_name)) {
  64. console.warn(
  65. `Duplicate output file ${output_name} generated from ${file}`
  66. );
  67. }
  68. file_map[output_name] = file;
  69. }
  70. return build_files({
  71. files: file_map,
  72. outdir: dist_path,
  73. outbase: public_path
  74. });
  75. });
  76. }
  77. function build_files({ files, outdir, outbase }) {
  78. return esbuild
  79. .build({
  80. entryPoints: files,
  81. outdir,
  82. outbase,
  83. sourcemap: true,
  84. bundle: true,
  85. metafile: true,
  86. // minify: true,
  87. nodePaths: NODE_PATHS,
  88. define: {
  89. "process.env.NODE_ENV": "'development'"
  90. },
  91. plugins: [
  92. html_plugin,
  93. ignore_assets,
  94. vue(),
  95. postCssPlugin({
  96. plugins: [require("autoprefixer")],
  97. sassOptions: sass_options
  98. })
  99. ],
  100. watch: WATCH_MODE
  101. ? {
  102. onRebuild(error, result) {
  103. if (error)
  104. console.error("watch build failed:", error);
  105. else {
  106. console.log("\n\nwatch build succeeded:");
  107. log_build_meta(result.metafile);
  108. }
  109. }
  110. }
  111. : null
  112. })
  113. .then(result => {
  114. log_build_meta(result.metafile);
  115. })
  116. .catch(e => {
  117. console.error("Error during build");
  118. });
  119. }
  120. function log_build_meta(metafile) {
  121. for (let outfile in metafile.outputs) {
  122. if (outfile.endsWith(".map")) continue;
  123. let data = metafile.outputs[outfile];
  124. outfile = path.resolve(outfile);
  125. outfile = path.relative(path.resolve(bench_path, "apps"), outfile);
  126. console.log(outfile, data.bytes / 1000 + " Kb");
  127. }
  128. }