Skip to content
Snippets Groups Projects

Replace ruby-sass with dart-sass (node)

Merged Muhammed Ali requested to merge gitlab-community/gitlab:replace-sass into master
2 unresolved threads
1 file
+ 64
58
Compare changes
  • Side-by-side
  • Inline
+ 64
58
import { compile } from 'sass'
import { SassString } from 'sass'
import glob from 'glob'
import { readdir, readdirSync, statSync } from 'fs'
import { mkdirSync, readdirSync, statSync, writeFileSync } from 'fs'
import path from 'path'
import IS_EE from '../../config/helpers/is_ee_env.js'
import IS_JH from '../../config/helpers/is_jh_env.js'
@@ -57,70 +56,77 @@ const defaultOptions = {
loadPaths: SASS_LOAD_PATHS,
}
let inputFiles = [
'app/assets/stylesheets/application.scss',
'app/assets/stylesheets/application_dark.scss',
'app/assets/stylesheets/application_utilities.scss',
'app/assets/stylesheets/application_utilities_dark.scss',
'app/assets/stylesheets/disable_animations.scss',
'app/assets/stylesheets/emoji_sprites.scss',
'app/assets/stylesheets/errors.scss',
'app/assets/stylesheets/fonts.scss',
'app/assets/stylesheets/mailer.scss',
'app/assets/stylesheets/mailer_client_specific.scss',
'app/assets/stylesheets/notify.scss',
'app/assets/stylesheets/notify_enhanced.scss',
'app/assets/stylesheets/performance_bar.scss',
'app/assets/stylesheets/print.scss',
'app/assets/stylesheets/snippets.scss',
'app/assets/stylesheets/test_environment.scss',
'app/assets/stylesheets/lazy_bundles/',
'app/assets/stylesheets/mailers/',
'app/assets/stylesheets/page_bundles/_mixins_and_variables_and_functions.scss',
'app/assets/stylesheets/page_bundles/',
'app/assets/stylesheets/themes/',
'app/assets/stylesheets/highlight/diff_custom_colors_addition.scss',
'app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss',
'app/assets/stylesheets/highlight/themes/',
]
let inputFiles = new Map([
['app/assets/stylesheets/application.scss', 'app/assets/builds/application.scss'],
['app/assets/stylesheets/application_dark.scss', 'app/assets/builds/application_dark.scss'],
['app/assets/stylesheets/application_utilities.scss', 'app/assets/builds/application_utilities.scss'],
['app/assets/stylesheets/application_utilities_dark.scss', 'app/assets/builds/application_utilities_dark.scss'],
['app/assets/stylesheets/disable_animations.scss', 'app/assets/builds/disable_animations.scss'],
['app/assets/stylesheets/emoji_sprites.scss', 'app/assets/builds/emoji_sprites.scss'],
['app/assets/stylesheets/errors.scss', 'app/assets/builds/errors.scss'],
['app/assets/stylesheets/fonts.scss', 'app/assets/builds/fonts.scss'],
['app/assets/stylesheets/mailer.scss', 'app/assets/builds/mailer.scss'],
['app/assets/stylesheets/mailer_client_specific.scss', 'app/assets/builds/mailer_client_specific.scss'],
['app/assets/stylesheets/notify.scss', 'app/assets/builds/notify.scss'],
['app/assets/stylesheets/notify_enhanced.scss', 'app/assets/builds/notify_enhanced.scss'],
['app/assets/stylesheets/performance_bar.scss', 'app/assets/builds/performance_bar.scss'],
['app/assets/stylesheets/print.scss', 'app/assets/builds/print.scss'],
['app/assets/stylesheets/snippets.scss', 'app/assets/builds/snippets.scss'],
['app/assets/stylesheets/test_environment.scss', 'app/assets/builds/test_environment.scss'],
['app/assets/stylesheets/lazy_bundles/', 'app/assets/builds/lazy_bundles/'],
['app/assets/stylesheets/mailers/', 'app/assets/builds/mailers/'],
['app/assets/stylesheets/page_bundles/_mixins_and_variables_and_functions.scss', 'app/assets/builds/page_bundles/_mixins_and_variables_and_functions.scss'],
['app/assets/stylesheets/page_bundles/', 'app/assets/builds/page_bundles/'],
['app/assets/stylesheets/themes/', 'app/assets/builds/themes/'],
['app/assets/stylesheets/highlight/diff_custom_colors_addition.scss', 'app/assets/builds/highlight/diff_custom_colors_addition.scss'],
['app/assets/stylesheets/highlight/diff_custom_colors_deletion.scss', 'app/assets/builds/highlight/diff_custom_colors_deletion.scss'],
['app/assets/stylesheets/highlight/themes/', 'app/assets/builds/highlight/themes/'],
])
// TODO: write out to /app/assets/builds/...
function compileFile(file) {
console.log(`Compiling file ${file}`);
let content = compile(file, defaultOptions)
console.log(`Compiled file ${file}`);
console.log(content);
if (IS_EE) {
inputFiles.set('ee/app/assets/stylesheets/page_bundles/', 'app/assets/builds/page_bundles/')
}
function resolveInput(input) {
console.log("Resolving input", input);
const fullPath = path.resolve(ROOT_PATH.pathname, input)
const filePaths = new Set();
function writeContentToFile(content, src, dest) {
const destPath = path.resolve(ROOT_PATH.pathname, dest);
let outputFile;
if (!!src.relativePath) {
outputFile = path.resolve(destPath, src.relativePath)
} else {
outputFile = destPath
}
console.log(`Writing ${src.fullPath} to ${outputFile}`)
mkdirSync(path.dirname(outputFile), { recursive: true });
writeFileSync(outputFile, content.css);
}
function resolveSources(source) {
console.log("Resolving source", source);
const fullPath = path.resolve(ROOT_PATH.pathname, source)
const paths = new Set();
if (statSync(fullPath).isDirectory()) {
readdirSync(fullPath).forEach((relativeFilePath) => {
const file = path.resolve(fullPath, relativeFilePath)
console.log(file);
if (statSync(file).isFile() && !relativeFilePath.startsWith('_')) {
filePaths.add(file)
readdirSync(fullPath).forEach((relativePath) => {
const file = path.resolve(fullPath, relativePath)
console.log(file, relativePath);
if (statSync(file).isFile() && !relativePath.startsWith('_')) {
// relativePath is the filename of the file in the directory
paths.add({ fullPath: file, relativePath: relativePath })
}
});
return filePaths
return paths
}
filePaths.add(fullPath)
return filePaths
// relativePath is unused here, as single files have an explicit destination
paths.add({ fullPath: fullPath })
return paths
}
function resolveContent(file) {
const files = resolveInput(file)
console.log("Input is resolved to: ", files)
files.forEach((file) => {
compileFile(file)
inputFiles.forEach((dest, source, _) => {
console.log("processing source", source);
const sources = resolveSources(source);
console.log(`${source} resolved to:`, sources)
sources.forEach((src) => {
const content = compile(src.fullPath, defaultOptions)
writeContentToFile(content, src, dest)
});
}
inputFiles.forEach((file) => {
console.log("processing file", file);
console.log(defaultOptions);
resolveContent(file);
console.log("processed file", file);
console.log("processed source", source);
});
Loading