| 
									
										
										
										
											2014-01-24 01:35:56 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2018-07-30 23:08:51 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | "use strict"; | 
					
						
							| 
									
										
										
										
											2014-01-24 01:35:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | const LocalModule = require("./LocalModule"); | 
					
						
							| 
									
										
										
										
											2014-01-24 01:35:56 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-22 06:58:24 +08:00
										 |  |  | /** @typedef {import("../javascript/JavascriptParser").ParserState} ParserState */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * @param {string} parent parent module | 
					
						
							|  |  |  |  * @param {string} mod module to resolve | 
					
						
							|  |  |  |  * @returns {string} resolved module | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | const lookup = (parent, mod) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (mod.charAt(0) !== ".") return mod; | 
					
						
							| 
									
										
										
										
											2015-02-02 12:12:33 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-07-31 09:56:53 +08:00
										 |  |  | 	const path = parent.split("/"); | 
					
						
							|  |  |  | 	const segments = mod.split("/"); | 
					
						
							| 
									
										
										
										
											2015-02-02 12:12:33 +08:00
										 |  |  | 	path.pop(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-13 00:51:26 +08:00
										 |  |  | 	for (let i = 0; i < segments.length; i++) { | 
					
						
							|  |  |  | 		const seg = segments[i]; | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		if (seg === "..") { | 
					
						
							|  |  |  | 			path.pop(); | 
					
						
							|  |  |  | 		} else if (seg !== ".") { | 
					
						
							|  |  |  | 			path.push(seg); | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-02-02 12:12:33 +08:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-04-24 05:55:50 +08:00
										 |  |  | 	return path.join("/"); | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-22 06:58:24 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ParserState} state parser state | 
					
						
							|  |  |  |  * @param {string} name name | 
					
						
							|  |  |  |  * @returns {LocalModule} local module | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.addLocalModule = (state, name) => { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 	if (!state.localModules) { | 
					
						
							|  |  |  | 		state.localModules = []; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-10-17 20:17:06 +08:00
										 |  |  | 	const m = new LocalModule(name, state.localModules.length); | 
					
						
							| 
									
										
										
										
											2017-02-23 16:23:17 +08:00
										 |  |  | 	state.localModules.push(m); | 
					
						
							|  |  |  | 	return m; | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-05-22 06:58:24 +08:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @param {ParserState} state parser state | 
					
						
							|  |  |  |  * @param {string} name name | 
					
						
							|  |  |  |  * @param {string} [namedModule] named module | 
					
						
							|  |  |  |  * @returns {LocalModule | null} local module or null | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2024-07-31 04:54:55 +08:00
										 |  |  | module.exports.getLocalModule = (state, name, namedModule) => { | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	if (!state.localModules) return null; | 
					
						
							|  |  |  | 	if (namedModule) { | 
					
						
							| 
									
										
										
										
											2017-02-23 16:23:17 +08:00
										 |  |  | 		// resolve dependency name relative to the defining named module
 | 
					
						
							|  |  |  | 		name = lookup(namedModule, name); | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2018-02-25 09:00:20 +08:00
										 |  |  | 	for (let i = 0; i < state.localModules.length; i++) { | 
					
						
							| 
									
										
										
										
											2018-05-29 20:50:40 +08:00
										 |  |  | 		if (state.localModules[i].name === name) { | 
					
						
							|  |  |  | 			return state.localModules[i]; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2017-02-23 05:52:02 +08:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2017-02-23 16:23:17 +08:00
										 |  |  | 	return null; | 
					
						
							|  |  |  | }; |