build-css.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. const sass = require('sass')
  2. const postcss = require('postcss')
  3. const autoprefixer = require('autoprefixer')
  4. const postcssLogical = require('postcss-logical')
  5. const postcssDirPseudoClass = require('postcss-dir-pseudo-class')
  6. const cssnano = require('cssnano')
  7. const chalk = require('chalk')
  8. const { promisify } = require('node:util')
  9. const fs = require('node:fs')
  10. const path = require('node:path')
  11. const resolve = require('resolve')
  12. const glob = promisify(require('glob'))
  13. const renderScss = promisify(sass.render)
  14. const { mkdir, writeFile } = fs.promises
  15. const cwd = process.cwd()
  16. function handleErr (err) {
  17. console.error(chalk.red('✗ Error:'), chalk.red(err.message))
  18. }
  19. async function compileCSS () {
  20. const files = await glob('packages/{,@uppy/}*/src/style.scss')
  21. for (const file of files) {
  22. const importedFiles = new Set()
  23. const scssResult = await renderScss({
  24. file,
  25. importer (url, from, done) {
  26. resolve(url, {
  27. basedir: path.dirname(from),
  28. filename: from,
  29. extensions: ['.scss'],
  30. }, (err, resolved) => {
  31. if (err) {
  32. done(err)
  33. return
  34. }
  35. const realpath = fs.realpathSync(resolved)
  36. if (importedFiles.has(realpath)) {
  37. done({ contents: '' })
  38. return
  39. }
  40. importedFiles.add(realpath)
  41. done({ file: realpath })
  42. })
  43. },
  44. })
  45. const plugins = [
  46. autoprefixer,
  47. postcssLogical(),
  48. postcssDirPseudoClass(),
  49. ]
  50. const postcssResult = await postcss(plugins)
  51. .process(scssResult.css, { from: file })
  52. postcssResult.warnings().forEach((warn) => {
  53. console.warn(warn.toString())
  54. })
  55. const outdir = path.join(path.dirname(file), '../dist')
  56. // Save the `uppy` package's CSS as `uppy.css`,
  57. // `@uppy/robodog` as `robodog.css`,
  58. // the rest as `style.css`.
  59. // const outfile = path.join(outdir, outdir.includes(path.normalize('packages/uppy/')) ? 'uppy.css' : 'style.css')
  60. let outfile = path.join(outdir, 'style.css')
  61. if (outdir.includes(path.normalize('packages/uppy/'))) {
  62. outfile = path.join(outdir, 'uppy.css')
  63. } else if (outdir.includes(path.normalize('packages/@uppy/robodog/'))) {
  64. outfile = path.join(outdir, 'robodog.css')
  65. }
  66. await mkdir(outdir, { recursive: true })
  67. await writeFile(outfile, postcssResult.css)
  68. console.info(
  69. chalk.green('✓ Built Uppy CSS:'),
  70. chalk.magenta(path.relative(cwd, outfile)),
  71. )
  72. const minifiedResult = await postcss([
  73. cssnano({ safe: true }),
  74. ]).process(postcssResult.css, { from: outfile })
  75. minifiedResult.warnings().forEach((warn) => {
  76. console.warn(warn.toString())
  77. })
  78. await writeFile(outfile.replace(/\.css$/, '.min.css'), minifiedResult.css)
  79. console.info(
  80. chalk.green('✓ Minified Bundle CSS:'),
  81. chalk.magenta(path.relative(cwd, outfile).replace(/\.css$/, '.min.css')),
  82. )
  83. }
  84. }
  85. compileCSS().then(() => {
  86. console.info(chalk.yellow('✓ CSS Bundles 🎉'))
  87. }, handleErr)