"use strict"; const { JSDOM } = require( "jsdom" ); const { window } = new JSDOM( "" ); const { jQueryFactory } = require( "jquery/factory" ); const jQuery = jQueryFactory( 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 ); } } }; };