You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			69 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | /* | ||
|  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | ||
|  | 	Author Tobias Koppers @sokra | ||
|  | */ | ||
|  | 
 | ||
|  | "use strict"; | ||
|  | 
 | ||
|  | const LocalModule = require("./LocalModule"); | ||
|  | 
 | ||
|  | /** @typedef {import("../javascript/JavascriptParser").ParserState} ParserState */ | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {string} parent parent module | ||
|  |  * @param {string} mod module to resolve | ||
|  |  * @returns {string} resolved module | ||
|  |  */ | ||
|  | const lookup = (parent, mod) => { | ||
|  | 	if (mod.charAt(0) !== ".") return mod; | ||
|  | 
 | ||
|  | 	var path = parent.split("/"); | ||
|  | 	var segments = mod.split("/"); | ||
|  | 	path.pop(); | ||
|  | 
 | ||
|  | 	for (let i = 0; i < segments.length; i++) { | ||
|  | 		const seg = segments[i]; | ||
|  | 		if (seg === "..") { | ||
|  | 			path.pop(); | ||
|  | 		} else if (seg !== ".") { | ||
|  | 			path.push(seg); | ||
|  | 		} | ||
|  | 	} | ||
|  | 
 | ||
|  | 	return path.join("/"); | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {ParserState} state parser state | ||
|  |  * @param {string} name name | ||
|  |  * @returns {LocalModule} local module | ||
|  |  */ | ||
|  | exports.addLocalModule = (state, name) => { | ||
|  | 	if (!state.localModules) { | ||
|  | 		state.localModules = []; | ||
|  | 	} | ||
|  | 	const m = new LocalModule(name, state.localModules.length); | ||
|  | 	state.localModules.push(m); | ||
|  | 	return m; | ||
|  | }; | ||
|  | 
 | ||
|  | /** | ||
|  |  * @param {ParserState} state parser state | ||
|  |  * @param {string} name name | ||
|  |  * @param {string} [namedModule] named module | ||
|  |  * @returns {LocalModule | null} local module or null | ||
|  |  */ | ||
|  | exports.getLocalModule = (state, name, namedModule) => { | ||
|  | 	if (!state.localModules) return null; | ||
|  | 	if (namedModule) { | ||
|  | 		// resolve dependency name relative to the defining named module
 | ||
|  | 		name = lookup(namedModule, name); | ||
|  | 	} | ||
|  | 	for (let i = 0; i < state.localModules.length; i++) { | ||
|  | 		if (state.localModules[i].name === name) { | ||
|  | 			return state.localModules[i]; | ||
|  | 		} | ||
|  | 	} | ||
|  | 	return null; | ||
|  | }; |