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.
		
		
		
		
		
			
		
			
	
	
		
			200 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
		
		
			
		
	
	
			200 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			JavaScript
		
	
| 
											9 months ago
										 | "use strict"; | ||
|  | Object.defineProperty(exports, "__esModule", { | ||
|  |     value: true | ||
|  | }); | ||
|  | 0 && (module.exports = { | ||
|  |     NoSuchDeclarationError: null, | ||
|  |     UnsupportedValueError: null, | ||
|  |     extractExportedConstValue: null | ||
|  | }); | ||
|  | function _export(target, all) { | ||
|  |     for(var name in all)Object.defineProperty(target, name, { | ||
|  |         enumerable: true, | ||
|  |         get: all[name] | ||
|  |     }); | ||
|  | } | ||
|  | _export(exports, { | ||
|  |     NoSuchDeclarationError: function() { | ||
|  |         return NoSuchDeclarationError; | ||
|  |     }, | ||
|  |     UnsupportedValueError: function() { | ||
|  |         return UnsupportedValueError; | ||
|  |     }, | ||
|  |     extractExportedConstValue: function() { | ||
|  |         return extractExportedConstValue; | ||
|  |     } | ||
|  | }); | ||
|  | class NoSuchDeclarationError extends Error { | ||
|  | } | ||
|  | function isExportDeclaration(node) { | ||
|  |     return node.type === "ExportDeclaration"; | ||
|  | } | ||
|  | function isVariableDeclaration(node) { | ||
|  |     return node.type === "VariableDeclaration"; | ||
|  | } | ||
|  | function isIdentifier(node) { | ||
|  |     return node.type === "Identifier"; | ||
|  | } | ||
|  | function isBooleanLiteral(node) { | ||
|  |     return node.type === "BooleanLiteral"; | ||
|  | } | ||
|  | function isNullLiteral(node) { | ||
|  |     return node.type === "NullLiteral"; | ||
|  | } | ||
|  | function isStringLiteral(node) { | ||
|  |     return node.type === "StringLiteral"; | ||
|  | } | ||
|  | function isNumericLiteral(node) { | ||
|  |     return node.type === "NumericLiteral"; | ||
|  | } | ||
|  | function isArrayExpression(node) { | ||
|  |     return node.type === "ArrayExpression"; | ||
|  | } | ||
|  | function isObjectExpression(node) { | ||
|  |     return node.type === "ObjectExpression"; | ||
|  | } | ||
|  | function isKeyValueProperty(node) { | ||
|  |     return node.type === "KeyValueProperty"; | ||
|  | } | ||
|  | function isRegExpLiteral(node) { | ||
|  |     return node.type === "RegExpLiteral"; | ||
|  | } | ||
|  | function isTemplateLiteral(node) { | ||
|  |     return node.type === "TemplateLiteral"; | ||
|  | } | ||
|  | class UnsupportedValueError extends Error { | ||
|  |     constructor(message, paths){ | ||
|  |         super(message); | ||
|  |         // Generating "path" that looks like "config.runtime[0].value"
 | ||
|  |         let codePath; | ||
|  |         if (paths) { | ||
|  |             codePath = ""; | ||
|  |             for (const path of paths){ | ||
|  |                 if (path[0] === "[") { | ||
|  |                     // "array" + "[0]"
 | ||
|  |                     codePath += path; | ||
|  |                 } else { | ||
|  |                     if (codePath === "") { | ||
|  |                         codePath = path; | ||
|  |                     } else { | ||
|  |                         // "object" + ".key"
 | ||
|  |                         codePath += `.${path}`; | ||
|  |                     } | ||
|  |                 } | ||
|  |             } | ||
|  |         } | ||
|  |         this.path = codePath; | ||
|  |     } | ||
|  | } | ||
|  | function extractValue(node, path) { | ||
|  |     if (isNullLiteral(node)) { | ||
|  |         return null; | ||
|  |     } else if (isBooleanLiteral(node)) { | ||
|  |         // e.g. true / false
 | ||
|  |         return node.value; | ||
|  |     } else if (isStringLiteral(node)) { | ||
|  |         // e.g. "abc"
 | ||
|  |         return node.value; | ||
|  |     } else if (isNumericLiteral(node)) { | ||
|  |         // e.g. 123
 | ||
|  |         return node.value; | ||
|  |     } else if (isRegExpLiteral(node)) { | ||
|  |         // e.g. /abc/i
 | ||
|  |         return new RegExp(node.pattern, node.flags); | ||
|  |     } else if (isIdentifier(node)) { | ||
|  |         switch(node.value){ | ||
|  |             case "undefined": | ||
|  |                 return undefined; | ||
|  |             default: | ||
|  |                 throw new UnsupportedValueError(`Unknown identifier "${node.value}"`, path); | ||
|  |         } | ||
|  |     } else if (isArrayExpression(node)) { | ||
|  |         // e.g. [1, 2, 3]
 | ||
|  |         const arr = []; | ||
|  |         for(let i = 0, len = node.elements.length; i < len; i++){ | ||
|  |             const elem = node.elements[i]; | ||
|  |             if (elem) { | ||
|  |                 if (elem.spread) { | ||
|  |                     // e.g. [ ...a ]
 | ||
|  |                     throw new UnsupportedValueError("Unsupported spread operator in the Array Expression", path); | ||
|  |                 } | ||
|  |                 arr.push(extractValue(elem.expression, path && [ | ||
|  |                     ...path, | ||
|  |                     `[${i}]` | ||
|  |                 ])); | ||
|  |             } else { | ||
|  |                 // e.g. [1, , 2]
 | ||
|  |                 //         ^^
 | ||
|  |                 arr.push(undefined); | ||
|  |             } | ||
|  |         } | ||
|  |         return arr; | ||
|  |     } else if (isObjectExpression(node)) { | ||
|  |         // e.g. { a: 1, b: 2 }
 | ||
|  |         const obj = {}; | ||
|  |         for (const prop of node.properties){ | ||
|  |             if (!isKeyValueProperty(prop)) { | ||
|  |                 // e.g. { ...a }
 | ||
|  |                 throw new UnsupportedValueError("Unsupported spread operator in the Object Expression", path); | ||
|  |             } | ||
|  |             let key; | ||
|  |             if (isIdentifier(prop.key)) { | ||
|  |                 // e.g. { a: 1, b: 2 }
 | ||
|  |                 key = prop.key.value; | ||
|  |             } else if (isStringLiteral(prop.key)) { | ||
|  |                 // e.g. { "a": 1, "b": 2 }
 | ||
|  |                 key = prop.key.value; | ||
|  |             } else { | ||
|  |                 throw new UnsupportedValueError(`Unsupported key type "${prop.key.type}" in the Object Expression`, path); | ||
|  |             } | ||
|  |             obj[key] = extractValue(prop.value, path && [ | ||
|  |                 ...path, | ||
|  |                 key | ||
|  |             ]); | ||
|  |         } | ||
|  |         return obj; | ||
|  |     } else if (isTemplateLiteral(node)) { | ||
|  |         // e.g. `abc`
 | ||
|  |         if (node.expressions.length !== 0) { | ||
|  |             // TODO: should we add support for `${'e'}d${'g'}'e'`?
 | ||
|  |             throw new UnsupportedValueError("Unsupported template literal with expressions", path); | ||
|  |         } | ||
|  |         // When TemplateLiteral has 0 expressions, the length of quasis is always 1.
 | ||
|  |         // Because when parsing TemplateLiteral, the parser yields the first quasi,
 | ||
|  |         // then the first expression, then the next quasi, then the next expression, etc.,
 | ||
|  |         // until the last quasi.
 | ||
|  |         // Thus if there is no expression, the parser ends at the frst and also last quasis
 | ||
|  |         //
 | ||
|  |         // A "cooked" interpretation where backslashes have special meaning, while a
 | ||
|  |         // "raw" interpretation where backslashes do not have special meaning
 | ||
|  |         // https://exploringjs.com/impatient-js/ch_template-literals.html#template-strings-cooked-vs-raw
 | ||
|  |         const [{ cooked, raw }] = node.quasis; | ||
|  |         return cooked ?? raw; | ||
|  |     } else { | ||
|  |         throw new UnsupportedValueError(`Unsupported node type "${node.type}"`, path); | ||
|  |     } | ||
|  | } | ||
|  | function extractExportedConstValue(module1, exportedName) { | ||
|  |     for (const moduleItem of module1.body){ | ||
|  |         if (!isExportDeclaration(moduleItem)) { | ||
|  |             continue; | ||
|  |         } | ||
|  |         const declaration = moduleItem.declaration; | ||
|  |         if (!isVariableDeclaration(declaration)) { | ||
|  |             continue; | ||
|  |         } | ||
|  |         if (declaration.kind !== "const") { | ||
|  |             continue; | ||
|  |         } | ||
|  |         for (const decl of declaration.declarations){ | ||
|  |             if (isIdentifier(decl.id) && decl.id.value === exportedName && decl.init) { | ||
|  |                 return extractValue(decl.init, [ | ||
|  |                     exportedName | ||
|  |                 ]); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  |     throw new NoSuchDeclarationError(); | ||
|  | } | ||
|  | 
 | ||
|  | //# sourceMappingURL=extract-const-value.js.map
 |