build-css.js 3.1 KB

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