| | |
| | | /** @typedef {{ streamChunks: StreamChunksFunction }} SourceLikeWithStreamChunks */ |
| | | |
| | | /** |
| | | * @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; |
| | | }; |
| | | |
| | | /** |
| | | * @param {SourceLikeWithStreamChunks} inputSource input source |
| | | * @param {Options=} options options |
| | | * @returns {SourceAndMap} map |
| | |
| | | } |
| | | : 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; |
| | | }; |