| "use strict"; | 
 |  | 
 | const { JSDOM } = require( "jsdom" ); | 
 |  | 
 | const { window } = new JSDOM( "" ); | 
 |  | 
 | const jQuery = require( "../../" )( window ); | 
 |  | 
 | module.exports.deferred = () => { | 
 | 	let adopted, promised; | 
 |  | 
 | 	return { | 
 | 		resolve: function() { | 
 | 			if ( !adopted ) { | 
 | 				adopted = jQuery.when.apply( jQuery, arguments ); | 
 | 				if ( promised ) { | 
 | 					adopted.then( promised.resolve, promised.reject ); | 
 | 				} | 
 | 			} | 
 | 			return adopted; | 
 | 		}, | 
 | 		reject: function( value ) { | 
 | 			if ( !adopted ) { | 
 | 				adopted = jQuery.when( jQuery.Deferred().reject( value ) ); | 
 | 				if ( promised ) { | 
 | 					adopted.then( promised.resolve, promised.reject ); | 
 | 				} | 
 | 			} | 
 | 			return adopted; | 
 | 		}, | 
 |  | 
 | 		// A manually-constructed thenable that works even if calls precede resolve/reject | 
 | 		promise: { | 
 | 			then: function() { | 
 | 				if ( !adopted ) { | 
 | 					if ( !promised ) { | 
 | 						promised = jQuery.Deferred(); | 
 | 					} | 
 | 					return promised.then.apply( promised, arguments ); | 
 | 				} | 
 | 				return adopted.then.apply( adopted, arguments ); | 
 | 			} | 
 | 		} | 
 | 	}; | 
 | }; |