UNPKG

webpack-sources

Version:

Source code handling classes for webpack

160 lines (153 loc) 4.46 kB
/* MIT License http://www.opensource.org/licenses/mit-license.php Author Tobias Koppers @sokra */ "use strict"; const createMappingsSerializer = require("./createMappingsSerializer"); /** @typedef {import("../Source").RawSourceMap} RawSourceMap */ /** @typedef {import("../Source").SourceAndMap} SourceAndMap */ /** @typedef {import("./streamChunks").Options} Options */ /** @typedef {import("./streamChunks").StreamChunksFunction} StreamChunksFunction */ /** @typedef {{ streamChunks: StreamChunksFunction }} SourceLikeWithStreamChunks */ /** * @param {SourceLikeWithStreamChunks} inputSource input source * @param {Options=} options options * @returns {SourceAndMap} map */ module.exports.getSourceAndMap = (inputSource, options) => { let code = ""; let mappings = ""; /** @type {(string | null)[]} */ const potentialSources = []; /** @type {(string | null)[]} */ const potentialSourcesContent = []; /** @type {(string | null)[]} */ const potentialNames = []; const addMapping = createMappingsSerializer(options); const { source } = inputSource.streamChunks( { ...options, finalSource: true }, ( chunk, generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex, ) => { if (chunk !== undefined) code += chunk; mappings += addMapping( generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex, ); }, (sourceIndex, source, sourceContent) => { while (potentialSources.length < sourceIndex) { potentialSources.push(null); } potentialSources[sourceIndex] = source; if (sourceContent !== undefined) { while (potentialSourcesContent.length < sourceIndex) { potentialSourcesContent.push(null); } potentialSourcesContent[sourceIndex] = sourceContent; } }, (nameIndex, name) => { while (potentialNames.length < nameIndex) { potentialNames.push(null); } potentialNames[nameIndex] = name; }, ); return { source: source !== undefined ? source : code, map: mappings.length > 0 ? { version: 3, file: "x", mappings, // We handle broken sources as `null`, in spec this field should be string, but no information what we should do in such cases if we change type it will be breaking change sources: /** @type {string[]} */ (potentialSources), sourcesContent: potentialSourcesContent.length > 0 ? /** @type {string[]} */ (potentialSourcesContent) : undefined, names: /** @type {string[]} */ (potentialNames), } : null, }; }; /** * @param {SourceLikeWithStreamChunks} source source * @param {Options=} options options * @returns {RawSourceMap | null} map */ module.exports.getMap = (source, options) => { let mappings = ""; /** @type {(string | null)[]} */ const potentialSources = []; /** @type {(string | null)[]} */ const potentialSourcesContent = []; /** @type {(string | null)[]} */ const potentialNames = []; const addMapping = createMappingsSerializer(options); source.streamChunks( { ...options, source: false, finalSource: true }, ( chunk, generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex, ) => { mappings += addMapping( generatedLine, generatedColumn, sourceIndex, originalLine, originalColumn, nameIndex, ); }, (sourceIndex, source, sourceContent) => { while (potentialSources.length < sourceIndex) { potentialSources.push(null); } potentialSources[sourceIndex] = source; if (sourceContent !== undefined) { while (potentialSourcesContent.length < sourceIndex) { potentialSourcesContent.push(null); } potentialSourcesContent[sourceIndex] = sourceContent; } }, (nameIndex, name) => { while (potentialNames.length < nameIndex) { potentialNames.push(null); } potentialNames[nameIndex] = name; }, ); return mappings.length > 0 ? { version: 3, file: "x", mappings, // We handle broken sources as `null`, in spec this field should be string, but no information what we should do in such cases if we change type it will be breaking change sources: /** @type {string[]} */ (potentialSources), sourcesContent: potentialSourcesContent.length > 0 ? /** @type {string[]} */ (potentialSourcesContent) : undefined, names: /** @type {string[]} */ (potentialNames), } : null; };