97 lines
2.6 KiB
JavaScript
97 lines
2.6 KiB
JavaScript
'use strict';
|
|
|
|
var StackTrace = require('stacktrace-js');
|
|
var SourcemapCodec = require('@jridgewell/sourcemap-codec');
|
|
|
|
function findStackframe (frames) {
|
|
for (var i = 4; i < frames.length; i++) {
|
|
if (!frames[i].fileName.match(/addon\/[^.]+\.js/)) {
|
|
return frames[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
exports.addon = function (renderer) {
|
|
if (process.env.NODE_ENV === 'production') {
|
|
// eslint-disable-next-line no-console
|
|
console.log(
|
|
'nano-css sourcemaps addon should be installed only in development mode. ' +
|
|
'Use (process.env.NODE !== "production") to check if you are in development mode.'
|
|
);
|
|
|
|
return;
|
|
}
|
|
|
|
var queue = [];
|
|
var timeout = null;
|
|
var sourceCache = {};
|
|
|
|
function flush () {
|
|
timeout = null;
|
|
|
|
var sources = [];
|
|
var segments = [];
|
|
var rules = [];
|
|
|
|
for (var i = 0; i < queue.length; i++) {
|
|
var item = queue[i];
|
|
|
|
rules.push(item.rule);
|
|
segments.push([[0, sources.length, item.lineNumber - 1, 0]]);
|
|
sources.push(item.fileName);
|
|
}
|
|
|
|
queue = [];
|
|
|
|
var mappings = SourcemapCodec.encode(segments);
|
|
var map = {
|
|
version: 3,
|
|
sources: sources,
|
|
mappings: mappings,
|
|
sourcesContent: sources.map(function (source) {
|
|
return sourceCache[source];
|
|
}),
|
|
};
|
|
|
|
var json = JSON.stringify(map);
|
|
var base64 = window.btoa(json);
|
|
var css = rules.join('\n') + '\n/*# sourceMappingURL=data:application/json;charset=utf-8;base64,' + base64 + ' */';
|
|
var style = document.createElement('style');
|
|
|
|
style.setAttribute('data-nano-css-sourcemaps', '');
|
|
style.appendChild(document.createTextNode(css));
|
|
document.head.appendChild(style);
|
|
}
|
|
|
|
function enqueue (rawCss) {
|
|
StackTrace.get({sourceCache: sourceCache})
|
|
.then(function (stackframes) {
|
|
var frame = findStackframe(stackframes);
|
|
|
|
if (!frame) {
|
|
return;
|
|
}
|
|
|
|
queue.push({
|
|
rule: rawCss,
|
|
fileName: frame.fileName,
|
|
lineNumber: frame.lineNumber,
|
|
});
|
|
|
|
if (!timeout) {
|
|
timeout = setTimeout(flush, 100);
|
|
}
|
|
// eslint-disable-next-line no-console
|
|
}, console.log);
|
|
}
|
|
|
|
var putRaw = renderer.putRaw;
|
|
|
|
renderer.putRaw = function (rawCSS) {
|
|
enqueue(rawCSS);
|
|
putRaw.apply(null, arguments);
|
|
};
|
|
|
|
renderer.sourcemaps = true;
|
|
};
|