Create sourcemaps when compiling SCSS

This commit is contained in:
Kijin Sung 2023-09-04 23:05:06 +09:00
parent 74cc098370
commit 096d841263

View file

@ -229,13 +229,26 @@ class Formatter
// Get the cleaned and concatenated content. // Get the cleaned and concatenated content.
$imported_list = []; $imported_list = [];
$content = self::concatCSS($source_filename, $target_filename, true, $imported_list); $content = self::concatCSS($source_filename, $target_filename, true, $imported_list);
if (strpos($content, '@charset') === false)
{
$content = '@charset "UTF-8";' . "\n" . $content;
}
$primary_filename = is_array($source_filename) ? array_first($source_filename) : $source_filename;
$sourcemap_filename = preg_replace('/\.css$/', '.map', $target_filename);
// Compile! // Compile!
try try
{ {
$scss_compiler = new \ScssPhp\ScssPhp\Compiler; $scss_compiler = new \ScssPhp\ScssPhp\Compiler;
$scss_compiler->setOutputStyle($minify ? \ScssPhp\ScssPhp\OutputStyle::COMPRESSED : \ScssPhp\ScssPhp\OutputStyle::EXPANDED); $scss_compiler->setOutputStyle($minify ? \ScssPhp\ScssPhp\OutputStyle::COMPRESSED : \ScssPhp\ScssPhp\OutputStyle::EXPANDED);
$scss_compiler->setImportPaths(array(dirname(is_array($source_filename) ? array_first($source_filename) : $source_filename))); $scss_compiler->setImportPaths(array(dirname($primary_filename)));
$scss_compiler->setSourceMap(\ScssPhp\ScssPhp\Compiler::SOURCE_MAP_FILE);
$scss_compiler->setSourceMapOptions([
'sourceMapURL' => basename($sourcemap_filename),
'sourceMapFilename' => basename($target_filename),
'sourceMapBasepath' => \RX_BASEDIR,
'sourceRoot' => \RX_BASEURL,
]);
if ($variables) if ($variables)
{ {
$converted_variables = []; $converted_variables = [];
@ -253,20 +266,26 @@ class Formatter
$scss_compiler->addVariables($converted_variables); $scss_compiler->addVariables($converted_variables);
} }
$content = $scss_compiler->compileString($content)->getCss() . "\n"; $compiler = $scss_compiler->compileString($content, $primary_filename);
$content = strpos($content, '@charset') === false ? ('@charset "UTF-8";' . "\n" . $content) : $content; $content = $compiler->getCss() . "\n";
$sourcemap = $compiler->getSourceMap();
$result = true; $result = true;
} }
catch (\Exception $e) catch (\Exception $e)
{ {
$filename = starts_with(\RX_BASEDIR, $source_filename) ? substr($source_filename, strlen(\RX_BASEDIR)) : $source_filename; $filename = starts_with(\RX_BASEDIR, $primary_filename) ? substr($primary_filename, strlen(\RX_BASEDIR)) : $primary_filename;
$message = preg_replace('/\(stdin\)\s/', '', $e->getMessage()); $message = preg_replace('/\(stdin\)\s/', '', $e->getMessage());
$content = sprintf("/*\n Error while compiling %s\n\n %s\n*/\n", $filename, $message); $content = sprintf("/*\n Error while compiling %s\n\n %s\n*/\n", $filename, $message);
$sourcemap = '';
$result = false; $result = false;
} }
// Save the result to the target file. // Save the result to the target file.
Storage::write($target_filename, $content); Storage::write($target_filename, $content);
if ($sourcemap)
{
Storage::write($sourcemap_filename, $sourcemap);
}
// Save the list of imported files. // Save the list of imported files.
Storage::writePHPData(preg_replace('/\.css$/', '.imports.php', $target_filename), $imported_list, null, false); Storage::writePHPData(preg_replace('/\.css$/', '.imports.php', $target_filename), $imported_list, null, false);
@ -461,6 +480,9 @@ class Formatter
$content = "@media $media {\n\n" . trim($content) . "\n\n}"; $content = "@media $media {\n\n" . trim($content) . "\n\n}";
} }
// Remove out-of-place sourcemap declarations.
$content = preg_replace('!/\\*# (sourceMappingURL=.+?)\\*/!s', '/* $1*/', $content);
// Append to the result string. // Append to the result string.
$original_filename = starts_with(\RX_BASEDIR, $filename) ? substr($filename, strlen(\RX_BASEDIR)) : $filename; $original_filename = starts_with(\RX_BASEDIR, $filename) ? substr($filename, strlen(\RX_BASEDIR)) : $filename;
if ($add_comment) if ($add_comment)