| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | /* | 
					
						
							|  |  |  | 	MIT License http://www.opensource.org/licenses/mit-license.php
 | 
					
						
							|  |  |  | 	Author Tobias Koppers @sokra | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-12-19 04:54:18 +08:00
										 |  |  | const SAFE_IDENTIFIER = /^[_a-zA-Z$][_a-zA-Z$0-9]*$/; | 
					
						
							| 
									
										
										
										
											2021-10-13 11:01:46 +08:00
										 |  |  | const RESERVED_IDENTIFIER = new Set([ | 
					
						
							| 
									
										
										
										
											2021-08-11 15:03:50 +08:00
										 |  |  | 	"break", | 
					
						
							|  |  |  | 	"case", | 
					
						
							|  |  |  | 	"catch", | 
					
						
							|  |  |  | 	"class", | 
					
						
							|  |  |  | 	"const", | 
					
						
							|  |  |  | 	"continue", | 
					
						
							|  |  |  | 	"debugger", | 
					
						
							|  |  |  | 	"default", | 
					
						
							|  |  |  | 	"delete", | 
					
						
							|  |  |  | 	"do", | 
					
						
							|  |  |  | 	"else", | 
					
						
							|  |  |  | 	"export", | 
					
						
							|  |  |  | 	"extends", | 
					
						
							|  |  |  | 	"finally", | 
					
						
							|  |  |  | 	"for", | 
					
						
							|  |  |  | 	"function", | 
					
						
							|  |  |  | 	"if", | 
					
						
							|  |  |  | 	"import", | 
					
						
							|  |  |  | 	"in", | 
					
						
							|  |  |  | 	"instanceof", | 
					
						
							|  |  |  | 	"new", | 
					
						
							|  |  |  | 	"return", | 
					
						
							|  |  |  | 	"super", | 
					
						
							|  |  |  | 	"switch", | 
					
						
							|  |  |  | 	"this", | 
					
						
							|  |  |  | 	"throw", | 
					
						
							|  |  |  | 	"try", | 
					
						
							|  |  |  | 	"typeof", | 
					
						
							|  |  |  | 	"var", | 
					
						
							|  |  |  | 	"void", | 
					
						
							|  |  |  | 	"while", | 
					
						
							|  |  |  | 	"with", | 
					
						
							|  |  |  | 	"enum", | 
					
						
							|  |  |  | 	// strict mode
 | 
					
						
							|  |  |  | 	"implements", | 
					
						
							|  |  |  | 	"interface", | 
					
						
							|  |  |  | 	"let", | 
					
						
							|  |  |  | 	"package", | 
					
						
							|  |  |  | 	"private", | 
					
						
							|  |  |  | 	"protected", | 
					
						
							|  |  |  | 	"public", | 
					
						
							|  |  |  | 	"static", | 
					
						
							|  |  |  | 	"yield", | 
					
						
							|  |  |  | 	"yield", | 
					
						
							|  |  |  | 	// module code
 | 
					
						
							|  |  |  | 	"await", | 
					
						
							|  |  |  | 	// skip future reserved keywords defined under ES1 till ES3
 | 
					
						
							|  |  |  | 	// additional
 | 
					
						
							|  |  |  | 	"null", | 
					
						
							|  |  |  | 	"true", | 
					
						
							|  |  |  | 	"false" | 
					
						
							| 
									
										
										
										
											2021-08-30 18:25:46 +08:00
										 |  |  | ]); | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | const propertyAccess = (properties, start = 0) => { | 
					
						
							|  |  |  | 	let str = ""; | 
					
						
							|  |  |  | 	for (let i = start; i < properties.length; i++) { | 
					
						
							|  |  |  | 		const p = properties[i]; | 
					
						
							|  |  |  | 		if (`${+p}` === p) { | 
					
						
							|  |  |  | 			str += `[${p}]`; | 
					
						
							| 
									
										
										
										
											2021-10-13 11:01:46 +08:00
										 |  |  | 		} else if (SAFE_IDENTIFIER.test(p) && !RESERVED_IDENTIFIER.has(p)) { | 
					
						
							| 
									
										
										
										
											2019-03-14 19:06:59 +08:00
										 |  |  | 			str += `.${p}`; | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			str += `[${JSON.stringify(p)}]`; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return str; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | module.exports = propertyAccess; |