You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					149 lines
				
				4.9 KiB
			
		
		
			
		
	
	
					149 lines
				
				4.9 KiB
			| 
								 
											3 years ago
										 
									 | 
							
								/***********************************************************************
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  A JavaScript tokenizer / parser / beautifier / compressor.
							 | 
						||
| 
								 | 
							
								  https://github.com/mishoo/UglifyJS2
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  -------------------------------- (C) ---------------------------------
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                           Author: Mihai Bazon
							 | 
						||
| 
								 | 
							
								                         <mihai.bazon@gmail.com>
							 | 
						||
| 
								 | 
							
								                       http://mihai.bazon.net/blog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  Distributed under the BSD license:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Redistribution and use in source and binary forms, with or without
							 | 
						||
| 
								 | 
							
								    modification, are permitted provided that the following conditions
							 | 
						||
| 
								 | 
							
								    are met:
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        * Redistributions of source code must retain the above
							 | 
						||
| 
								 | 
							
								          copyright notice, this list of conditions and the following
							 | 
						||
| 
								 | 
							
								          disclaimer.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        * Redistributions in binary form must reproduce the above
							 | 
						||
| 
								 | 
							
								          copyright notice, this list of conditions and the following
							 | 
						||
| 
								 | 
							
								          disclaimer in the documentation and/or other materials
							 | 
						||
| 
								 | 
							
								          provided with the distribution.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
							 | 
						||
| 
								 | 
							
								    EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
							 | 
						||
| 
								 | 
							
								    IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
							 | 
						||
| 
								 | 
							
								    PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
							 | 
						||
| 
								 | 
							
								    LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
							 | 
						||
| 
								 | 
							
								    OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
							 | 
						||
| 
								 | 
							
								    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
							 | 
						||
| 
								 | 
							
								    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
							 | 
						||
| 
								 | 
							
								    THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
							 | 
						||
| 
								 | 
							
								    TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
							 | 
						||
| 
								 | 
							
								    THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
							 | 
						||
| 
								 | 
							
								    SUCH DAMAGE.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								 ***********************************************************************/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								"use strict";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {SourceMapConsumer, SourceMapGenerator} from "@jridgewell/source-map";
							 | 
						||
| 
								 | 
							
								import {defaults, HOP} from "./utils/index.js";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// a small wrapper around source-map and @jridgewell/source-map
							 | 
						||
| 
								 | 
							
								async function SourceMap(options) {
							 | 
						||
| 
								 | 
							
								    options = defaults(options, {
							 | 
						||
| 
								 | 
							
								        file : null,
							 | 
						||
| 
								 | 
							
								        root : null,
							 | 
						||
| 
								 | 
							
								        orig : null,
							 | 
						||
| 
								 | 
							
								        files: {},
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    var orig_map;
							 | 
						||
| 
								 | 
							
								    var generator = new SourceMapGenerator({
							 | 
						||
| 
								 | 
							
								        file       : options.file,
							 | 
						||
| 
								 | 
							
								        sourceRoot : options.root
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let sourcesContent = {__proto__: null};
							 | 
						||
| 
								 | 
							
								    let files = options.files;
							 | 
						||
| 
								 | 
							
								    for (var name in files) if (HOP(files, name)) {
							 | 
						||
| 
								 | 
							
								        sourcesContent[name] = files[name];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    if (options.orig) {
							 | 
						||
| 
								 | 
							
								        // We support both @jridgewell/source-map (which has a sync
							 | 
						||
| 
								 | 
							
								        // SourceMapConsumer) and source-map (which has an async
							 | 
						||
| 
								 | 
							
								        // SourceMapConsumer).
							 | 
						||
| 
								 | 
							
								        orig_map = await new SourceMapConsumer(options.orig);
							 | 
						||
| 
								 | 
							
								        if (orig_map.sourcesContent) {
							 | 
						||
| 
								 | 
							
								            orig_map.sources.forEach(function(source, i) {
							 | 
						||
| 
								 | 
							
								                var content = orig_map.sourcesContent[i];
							 | 
						||
| 
								 | 
							
								                if (content) {
							 | 
						||
| 
								 | 
							
								                    sourcesContent[source] = content;
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function add(source, gen_line, gen_col, orig_line, orig_col, name) {
							 | 
						||
| 
								 | 
							
								        let generatedPos = { line: gen_line, column: gen_col };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (orig_map) {
							 | 
						||
| 
								 | 
							
								            var info = orig_map.originalPositionFor({
							 | 
						||
| 
								 | 
							
								                line: orig_line,
							 | 
						||
| 
								 | 
							
								                column: orig_col
							 | 
						||
| 
								 | 
							
								            });
							 | 
						||
| 
								 | 
							
								            if (info.source === null) {
							 | 
						||
| 
								 | 
							
								                generator.addMapping({
							 | 
						||
| 
								 | 
							
								                    generated: generatedPos,
							 | 
						||
| 
								 | 
							
								                    original: null,
							 | 
						||
| 
								 | 
							
								                    source: null,
							 | 
						||
| 
								 | 
							
								                    name: null
							 | 
						||
| 
								 | 
							
								                });
							 | 
						||
| 
								 | 
							
								                return;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            source = info.source;
							 | 
						||
| 
								 | 
							
								            orig_line = info.line;
							 | 
						||
| 
								 | 
							
								            orig_col = info.column;
							 | 
						||
| 
								 | 
							
								            name = info.name || name;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        generator.addMapping({
							 | 
						||
| 
								 | 
							
								            generated : generatedPos,
							 | 
						||
| 
								 | 
							
								            original  : { line: orig_line, column: orig_col },
							 | 
						||
| 
								 | 
							
								            source    : source,
							 | 
						||
| 
								 | 
							
								            name      : name
							 | 
						||
| 
								 | 
							
								        });
							 | 
						||
| 
								 | 
							
								        generator.setSourceContent(source, sourcesContent[source]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function clean(map) {
							 | 
						||
| 
								 | 
							
								        const allNull = map.sourcesContent && map.sourcesContent.every(c => c == null);
							 | 
						||
| 
								 | 
							
								        if (allNull) delete map.sourcesContent;
							 | 
						||
| 
								 | 
							
								        if (map.file === undefined) delete map.file;
							 | 
						||
| 
								 | 
							
								        if (map.sourceRoot === undefined) delete map.sourceRoot;
							 | 
						||
| 
								 | 
							
								        return map;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function getDecoded() {
							 | 
						||
| 
								 | 
							
								        if (!generator.toDecodedMap) return null;
							 | 
						||
| 
								 | 
							
								        return clean(generator.toDecodedMap());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function getEncoded() {
							 | 
						||
| 
								 | 
							
								        return clean(generator.toJSON());
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    function destroy() {
							 | 
						||
| 
								 | 
							
								        // @jridgewell/source-map's SourceMapConsumer does not need to be
							 | 
						||
| 
								 | 
							
								        // manually freed.
							 | 
						||
| 
								 | 
							
								        if (orig_map && orig_map.destroy) orig_map.destroy();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return {
							 | 
						||
| 
								 | 
							
								        add,
							 | 
						||
| 
								 | 
							
								        getDecoded,
							 | 
						||
| 
								 | 
							
								        getEncoded,
							 | 
						||
| 
								 | 
							
								        destroy,
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export {
							 | 
						||
| 
								 | 
							
								    SourceMap,
							 | 
						||
| 
								 | 
							
								};
							 |