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.
		
		
		
		
			
				
					53 lines
				
				1.4 KiB
			
		
		
			
		
	
	
					53 lines
				
				1.4 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								'use strict';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var has = require('has');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var GetIntrinsic = require('get-intrinsic');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var $TypeError = GetIntrinsic('%TypeError%');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								var Type = require('./Type');
							 | 
						||
| 
								 | 
							
								var ToBoolean = require('./ToBoolean');
							 | 
						||
| 
								 | 
							
								var IsCallable = require('./IsCallable');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// https://262.ecma-international.org/5.1/#sec-8.10.5
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								module.exports = function ToPropertyDescriptor(Obj) {
							 | 
						||
| 
								 | 
							
									if (Type(Obj) !== 'Object') {
							 | 
						||
| 
								 | 
							
										throw new $TypeError('ToPropertyDescriptor requires an object');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									var desc = {};
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'enumerable')) {
							 | 
						||
| 
								 | 
							
										desc['[[Enumerable]]'] = ToBoolean(Obj.enumerable);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'configurable')) {
							 | 
						||
| 
								 | 
							
										desc['[[Configurable]]'] = ToBoolean(Obj.configurable);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'value')) {
							 | 
						||
| 
								 | 
							
										desc['[[Value]]'] = Obj.value;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'writable')) {
							 | 
						||
| 
								 | 
							
										desc['[[Writable]]'] = ToBoolean(Obj.writable);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'get')) {
							 | 
						||
| 
								 | 
							
										var getter = Obj.get;
							 | 
						||
| 
								 | 
							
										if (typeof getter !== 'undefined' && !IsCallable(getter)) {
							 | 
						||
| 
								 | 
							
											throw new $TypeError('getter must be a function');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										desc['[[Get]]'] = getter;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									if (has(Obj, 'set')) {
							 | 
						||
| 
								 | 
							
										var setter = Obj.set;
							 | 
						||
| 
								 | 
							
										if (typeof setter !== 'undefined' && !IsCallable(setter)) {
							 | 
						||
| 
								 | 
							
											throw new $TypeError('setter must be a function');
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										desc['[[Set]]'] = setter;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									if ((has(desc, '[[Get]]') || has(desc, '[[Set]]')) && (has(desc, '[[Value]]') || has(desc, '[[Writable]]'))) {
							 | 
						||
| 
								 | 
							
										throw new $TypeError('Invalid property descriptor. Cannot both specify accessors and a value or writable attribute');
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
									return desc;
							 | 
						||
| 
								 | 
							
								};
							 |