build-css.js 3.0 KB

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