build-css.js 2.9 KB

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