build-css.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const sass = require('node-sass')
  2. const postcss = require('postcss')
  3. const autoprefixer = require('autoprefixer')
  4. const cssnano = require('cssnano')
  5. const safeImportant = require('postcss-safe-important')
  6. const chalk = require('chalk')
  7. const { promisify } = require('util')
  8. const fs = require('fs')
  9. const path = require('path')
  10. const resolve = require('resolve')
  11. const mkdirp = promisify(require('mkdirp'))
  12. const glob = promisify(require('glob'))
  13. const renderScss = promisify(sass.render)
  14. const writeFile = promisify(fs.writeFile)
  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 scssResult = await renderScss({
  23. file,
  24. importedFiles: new Set(),
  25. importer (url, from, done) {
  26. resolve(url, {
  27. basedir: path.dirname(from),
  28. filename: from,
  29. extensions: ['.scss']
  30. }, (err, res) => {
  31. if (err) return done(err)
  32. res = fs.realpathSync(res)
  33. if (this.options.importedFiles.has(res)) return done({ contents: '' })
  34. this.options.importedFiles.add(res)
  35. done({ file: res })
  36. })
  37. }
  38. })
  39. const postcssResult = await postcss([ autoprefixer, safeImportant ])
  40. .process(scssResult.css, { from: file })
  41. postcssResult.warnings().forEach(function (warn) {
  42. console.warn(warn.toString())
  43. })
  44. const outdir = path.join(path.dirname(file), '../dist')
  45. // Save the `uppy` package's CSS as `uppy.css`, the rest as `style.css`.
  46. const outfile = path.join(outdir, outdir.includes('packages/uppy/') ? 'uppy.css' : 'style.css')
  47. await mkdirp(outdir)
  48. await writeFile(outfile, postcssResult.css)
  49. console.info(
  50. chalk.green('✓ Built Uppy CSS:'),
  51. chalk.magenta(path.relative(cwd, outfile))
  52. )
  53. const minifiedResult = await postcss([
  54. cssnano({ safe: true })
  55. ]).process(postcssResult.css, { from: outfile })
  56. minifiedResult.warnings().forEach(function (warn) {
  57. console.warn(warn.toString())
  58. })
  59. await writeFile(outfile.replace(/\.css$/, '.min.css'), minifiedResult.css)
  60. console.info(
  61. chalk.green('✓ Minified Bundle CSS:'),
  62. chalk.magenta(path.relative(cwd, outfile).replace(/\.css$/, '.min.css'))
  63. )
  64. }
  65. }
  66. compileCSS().then(() => {
  67. console.info(chalk.yellow('✓ CSS Bundles 🎉'))
  68. }, handleErr)