beyond
Version:
The Full Stack Universal Typescript Framework
76 lines (60 loc) • 2.79 kB
JavaScript
const sass = require('sass');
const toHtml = new (require('ansi-to-html'));
module.exports = class extends global.ProcessorCompiler {
get dp() {
return 'sass.compiler';
}
get depfiles() {
return this.children.get('dependencies.files')?.child;
}
constructor(packager) {
super(packager, require('./children'));
}
if (source.basename.startsWith('_')) return {};
const importer = new (require('./importer'))(source, this);
const {processor, distribution} = this.packager;
const options = {sourceMap: true, importer};
let result;
try {
result = sass.compileString(source.content ?? '', options);
}
catch (exc) {
const message = `${exc.sassMessage} ${!!exc.span?.text ? exc.span.text : ''}`;
let html = toHtml.toHtml(exc.message);
html = html.replace(/\n/g, '<br/>');
html = `<div style="background: #ddd; color: #333;">${html}</div>`;
const compiled = new this.CompiledSource(processor, distribution, source.is, source, {});
const {file} = source.relative;
const {line, column} = exc.span ? exc.span.start : {};
const errors = [{message, html, file, line, character: column}];
return {compiled, errors};
}
const {css, sourceMap: map} = result;
const code = css.toString();
map.sources[0] = source.url;
const compiled = new this.CompiledSource(processor, distribution, source.is, source, {code, map});
return {compiled};
}
async _compile(updated, diagnostics, meta, request) {
const analyzer = this.children.get('analyzer').child;
const {files, extensions, overwrites} = analyzer;
const process = async (sources, is) => {
for (const source of sources.values()) {
const {file} = source.relative;
let compiled, errors;
const singular = is === 'files' ? 'source' : (is === 'extensions' ? 'extension' : 'overwrite');
const csource = await this.
if (this._request !== request) return;
if (!csource) continue;
({compiled, errors} = csource);
if (!compiled && !errors) continue;
compiled && updated[is].set(file, compiled);
errors?.length && diagnostics[is].set(file, errors);
}
}
await process(files, 'files');
await process(extensions, 'extensions');
overwrites && await process(overwrites, 'overwrites');
}
}