|
|
var SourceMapGenerator = require('source-map').SourceMapGenerator; var all = require('./helpers').all;
var isRemoteResource = require('../utils/is-remote-resource');
var isWindows = process.platform == 'win32';
var NIX_SEPARATOR_PATTERN = /\//g; var UNKNOWN_SOURCE = '$stdin'; var WINDOWS_SEPARATOR = '\\';
function store(serializeContext, element) { var fromString = typeof element == 'string'; var value = fromString ? element : element[1]; var mappings = fromString ? null : element[2]; var wrap = serializeContext.wrap;
wrap(serializeContext, value); track(serializeContext, value, mappings); serializeContext.output.push(value); }
function wrap(serializeContext, value) { if (serializeContext.column + value.length > serializeContext.format.wrapAt) { track(serializeContext, serializeContext.format.breakWith, false); serializeContext.output.push(serializeContext.format.breakWith); } }
function track(serializeContext, value, mappings) { var parts = value.split('\n');
if (mappings) { trackAllMappings(serializeContext, mappings); }
serializeContext.line += parts.length - 1; serializeContext.column = parts.length > 1 ? 0 : (serializeContext.column + parts.pop().length); }
function trackAllMappings(serializeContext, mappings) { for (var i = 0, l = mappings.length; i < l; i++) { trackMapping(serializeContext, mappings[i]); } }
function trackMapping(serializeContext, mapping) { var line = mapping[0]; var column = mapping[1]; var originalSource = mapping[2]; var source = originalSource; var storedSource = source || UNKNOWN_SOURCE;
if (isWindows && source && !isRemoteResource(source)) { storedSource = source.replace(NIX_SEPARATOR_PATTERN, WINDOWS_SEPARATOR); }
serializeContext.outputMap.addMapping({ generated: { line: serializeContext.line, column: serializeContext.column }, source: storedSource, original: { line: line, column: column } });
if (serializeContext.inlineSources && (originalSource in serializeContext.sourcesContent)) { serializeContext.outputMap.setSourceContent(storedSource, serializeContext.sourcesContent[originalSource]); } }
function serializeStylesAndSourceMap(tokens, context) { var serializeContext = { column: 0, format: context.options.format, indentBy: 0, indentWith: '', inlineSources: context.options.sourceMapInlineSources, line: 1, output: [], outputMap: new SourceMapGenerator(), sourcesContent: context.sourcesContent, spaceAfterClosingBrace: context.options.compatibility.properties.spaceAfterClosingBrace, store: store, wrap: context.options.format.wrapAt ? wrap : function () { /* noop */ } };
all(serializeContext, tokens);
return { sourceMap: serializeContext.outputMap, styles: serializeContext.output.join('') }; }
module.exports = serializeStylesAndSourceMap;
|