mirror of
https://github.com/discourse/discourse.git
synced 2025-02-25 18:55:32 -06:00
DEV: Update pretender and fake-xml-http-request (#13937)
We are still on a version of pretender since 2017 https://github.com/pretenderjs/pretender/releases/tag/v1.6.1 Since then many changes have been made, including adding support for xhr.upload. Upgrading will let us write proper acceptance tests for uppy, which uses XmlHTTPRequest internally including xhr.upload. Updates pretender to 3.4.7 and fake-xml-http-request to 2.1.2. Note: There have been no breaking changes in the releases that would affect us, mainly dropping support for old node versions.
This commit is contained in:
@@ -54,7 +54,7 @@
|
||||
"message-bus-client": "^3.3.0",
|
||||
"mousetrap": "^1.6.5",
|
||||
"mousetrap-global-bind": "^1.1.0",
|
||||
"pretender": "^3.4.3",
|
||||
"pretender": "^3.4.7",
|
||||
"pretty-text": "^1.0.0",
|
||||
"qunit": "^2.14.0",
|
||||
"qunit-dom": "^1.6.0",
|
||||
|
||||
@@ -5935,7 +5935,7 @@ extsprintf@^1.2.0:
|
||||
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f"
|
||||
integrity sha1-4mifjzVvrWLMplo6kcXfX5VRaS8=
|
||||
|
||||
fake-xml-http-request@^2.1.1:
|
||||
fake-xml-http-request@^2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.2.tgz#f1786720cae50bbb46273035a0173414f3e85e74"
|
||||
integrity sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg==
|
||||
@@ -9347,12 +9347,12 @@ prepend-http@^2.0.0:
|
||||
resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897"
|
||||
integrity sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=
|
||||
|
||||
pretender@^3.4.3:
|
||||
version "3.4.3"
|
||||
resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.3.tgz#a3b4160516007075d29127262f3a0063d19896e9"
|
||||
integrity sha512-AlbkBly9R8KR+R0sTCJ/ToOeEoUMtt52QVCetui5zoSmeLOU3S8oobFsyPLm1O2txR6t58qDNysqPnA1vVi8Hg==
|
||||
pretender@^3.4.7:
|
||||
version "3.4.7"
|
||||
resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.7.tgz#34a2ae2d1fc9db440a990d50e6c0f5481d8755fc"
|
||||
integrity sha512-jkPAvt1BfRi0RKamweJdEcnjkeu7Es8yix3bJ+KgBC5VpG/Ln4JE3hYN6vJym4qprm8Xo5adhWpm3HCoft1dOw==
|
||||
dependencies:
|
||||
fake-xml-http-request "^2.1.1"
|
||||
fake-xml-http-request "^2.1.2"
|
||||
route-recognizer "^0.3.3"
|
||||
|
||||
printf@^0.6.1:
|
||||
|
||||
@@ -188,7 +188,10 @@ def dependencies
|
||||
source: 'qunit/qunit/qunit.js'
|
||||
},
|
||||
{
|
||||
source: 'pretender/pretender.js'
|
||||
source: 'pretender/dist/pretender.js'
|
||||
},
|
||||
{
|
||||
source: 'fake-xml-http-request/fake_xml_http_request.js'
|
||||
},
|
||||
{
|
||||
source: 'sinon/pkg/sinon.js'
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
"chrome-launcher": "^0.12.0",
|
||||
"chrome-remote-interface": "^0.25",
|
||||
"lodash-cli": "https://github.com/lodash-archive/lodash-cli.git",
|
||||
"pretender": "^1.6",
|
||||
"pretender": "^3.4.7",
|
||||
"puppeteer": "1.20",
|
||||
"qunit": "2.8.0",
|
||||
"route-recognizer": "^0.3.3",
|
||||
|
||||
256
vendor/assets/javascripts/fake_xml_http_request.js
vendored
256
vendor/assets/javascripts/fake_xml_http_request.js
vendored
@@ -1,5 +1,10 @@
|
||||
(function(undefined){
|
||||
/**
|
||||
(function (global, factory) {
|
||||
typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
|
||||
typeof define === 'function' && define.amd ? define(factory) :
|
||||
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.FakeXMLHttpRequest = factory());
|
||||
}(this, (function () { 'use strict';
|
||||
|
||||
/**
|
||||
* Minimal Event interface implementation
|
||||
*
|
||||
* Original implementation by Sven Fuchs: https://gist.github.com/995028
|
||||
@@ -12,24 +17,24 @@
|
||||
* Copyright (c) 2011 Sven Fuchs, Christian Johansen
|
||||
*/
|
||||
|
||||
var _Event = function Event(type, bubbles, cancelable, target) {
|
||||
var _Event = function Event(type, bubbles, cancelable, target) {
|
||||
this.type = type;
|
||||
this.bubbles = bubbles;
|
||||
this.cancelable = cancelable;
|
||||
this.target = target;
|
||||
};
|
||||
};
|
||||
|
||||
_Event.prototype = {
|
||||
_Event.prototype = {
|
||||
stopPropagation: function () {},
|
||||
preventDefault: function () {
|
||||
this.defaultPrevented = true;
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
/*
|
||||
Used to set the statusText property of an xhr object
|
||||
*/
|
||||
var httpStatusCodes = {
|
||||
*/
|
||||
var httpStatusCodes = {
|
||||
100: "Continue",
|
||||
101: "Switching Protocols",
|
||||
200: "OK",
|
||||
@@ -71,15 +76,15 @@ var httpStatusCodes = {
|
||||
503: "Service Unavailable",
|
||||
504: "Gateway Timeout",
|
||||
505: "HTTP Version Not Supported"
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
/*
|
||||
Cross-browser XML parsing. Used to turn
|
||||
XML responses into Document objects
|
||||
Borrowed from JSpec
|
||||
*/
|
||||
function parseXML(text) {
|
||||
*/
|
||||
function parseXML(text) {
|
||||
var xmlDoc;
|
||||
|
||||
if (typeof DOMParser != "undefined") {
|
||||
@@ -92,13 +97,13 @@ function parseXML(text) {
|
||||
}
|
||||
|
||||
return xmlDoc;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
/*
|
||||
Without mocking, the native XMLHttpRequest object will throw
|
||||
an error when attempting to set these headers. We match this behavior.
|
||||
*/
|
||||
var unsafeHeaders = {
|
||||
*/
|
||||
var unsafeHeaders = {
|
||||
"Accept-Charset": true,
|
||||
"Accept-Encoding": true,
|
||||
"Connection": true,
|
||||
@@ -117,73 +122,31 @@ var unsafeHeaders = {
|
||||
"Upgrade": true,
|
||||
"User-Agent": true,
|
||||
"Via": true
|
||||
};
|
||||
};
|
||||
|
||||
/*
|
||||
/*
|
||||
Adds an "event" onto the fake xhr object
|
||||
that just calls the same-named method. This is
|
||||
in case a library adds callbacks for these events.
|
||||
*/
|
||||
function _addEventListener(eventName, xhr){
|
||||
*/
|
||||
function _addEventListener(eventName, xhr){
|
||||
xhr.addEventListener(eventName, function (event) {
|
||||
var listener = xhr["on" + eventName];
|
||||
|
||||
if (listener && typeof listener == "function") {
|
||||
listener(event);
|
||||
listener.call(event.target, event);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/*
|
||||
Constructor for a fake window.XMLHttpRequest
|
||||
*/
|
||||
function FakeXMLHttpRequest() {
|
||||
this.readyState = FakeXMLHttpRequest.UNSENT;
|
||||
this.requestHeaders = {};
|
||||
this.requestBody = null;
|
||||
this.status = 0;
|
||||
this.statusText = "";
|
||||
}
|
||||
|
||||
function EventedObject() {
|
||||
this._eventListeners = {};
|
||||
var events = ["loadstart", "load", "abort", "loadend"];
|
||||
var events = ["loadstart", "progress", "load", "abort", "loadend"];
|
||||
for (var i = events.length - 1; i >= 0; i--) {
|
||||
_addEventListener(events[i], this);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// These status codes are available on the native XMLHttpRequest
|
||||
// object, so we match that here in case a library is relying on them.
|
||||
FakeXMLHttpRequest.UNSENT = 0;
|
||||
FakeXMLHttpRequest.OPENED = 1;
|
||||
FakeXMLHttpRequest.HEADERS_RECEIVED = 2;
|
||||
FakeXMLHttpRequest.LOADING = 3;
|
||||
FakeXMLHttpRequest.DONE = 4;
|
||||
|
||||
FakeXMLHttpRequest.prototype = {
|
||||
UNSENT: 0,
|
||||
OPENED: 1,
|
||||
HEADERS_RECEIVED: 2,
|
||||
LOADING: 3,
|
||||
DONE: 4,
|
||||
async: true,
|
||||
|
||||
/*
|
||||
Duplicates the behavior of native XMLHttpRequest's open function
|
||||
*/
|
||||
open: function open(method, url, async, username, password) {
|
||||
this.method = method;
|
||||
this.url = url;
|
||||
this.async = typeof async == "boolean" ? async : true;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.responseText = null;
|
||||
this.responseXML = null;
|
||||
this.requestHeaders = {};
|
||||
this.sendFlag = false;
|
||||
this._readyStateChange(FakeXMLHttpRequest.OPENED);
|
||||
},
|
||||
|
||||
}
|
||||
EventedObject.prototype = {
|
||||
/*
|
||||
Duplicates the behavior of native XMLHttpRequest's addEventListener function
|
||||
*/
|
||||
@@ -223,6 +186,77 @@ FakeXMLHttpRequest.prototype = {
|
||||
return !!event.defaultPrevented;
|
||||
},
|
||||
|
||||
/*
|
||||
Triggers an `onprogress` event with the given parameters.
|
||||
*/
|
||||
_progress: function _progress(lengthComputable, loaded, total) {
|
||||
var event = new _Event('progress');
|
||||
event.target = this;
|
||||
event.lengthComputable = lengthComputable;
|
||||
event.loaded = loaded;
|
||||
event.total = total;
|
||||
this.dispatchEvent(event);
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
Constructor for a fake window.XMLHttpRequest
|
||||
*/
|
||||
function FakeXMLHttpRequest() {
|
||||
EventedObject.call(this);
|
||||
this.readyState = FakeXMLHttpRequest.UNSENT;
|
||||
this.requestHeaders = {};
|
||||
this.requestBody = null;
|
||||
this.status = 0;
|
||||
this.statusText = "";
|
||||
this.upload = new EventedObject();
|
||||
this.onabort= null;
|
||||
this.onerror= null;
|
||||
this.onload= null;
|
||||
this.onloadend= null;
|
||||
this.onloadstart= null;
|
||||
this.onprogress= null;
|
||||
this.onreadystatechange= null;
|
||||
this.ontimeout= null;
|
||||
}
|
||||
|
||||
FakeXMLHttpRequest.prototype = new EventedObject();
|
||||
|
||||
// These status codes are available on the native XMLHttpRequest
|
||||
// object, so we match that here in case a library is relying on them.
|
||||
FakeXMLHttpRequest.UNSENT = 0;
|
||||
FakeXMLHttpRequest.OPENED = 1;
|
||||
FakeXMLHttpRequest.HEADERS_RECEIVED = 2;
|
||||
FakeXMLHttpRequest.LOADING = 3;
|
||||
FakeXMLHttpRequest.DONE = 4;
|
||||
|
||||
var FakeXMLHttpRequestProto = {
|
||||
UNSENT: 0,
|
||||
OPENED: 1,
|
||||
HEADERS_RECEIVED: 2,
|
||||
LOADING: 3,
|
||||
DONE: 4,
|
||||
async: true,
|
||||
withCredentials: false,
|
||||
|
||||
/*
|
||||
Duplicates the behavior of native XMLHttpRequest's open function
|
||||
*/
|
||||
open: function open(method, url, async, username, password) {
|
||||
this.method = method;
|
||||
this.url = url;
|
||||
this.async = typeof async == "boolean" ? async : true;
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
this.responseText = null;
|
||||
this.response = this.responseText;
|
||||
this.responseXML = null;
|
||||
this.responseURL = url;
|
||||
this.requestHeaders = {};
|
||||
this.sendFlag = false;
|
||||
this._readyStateChange(FakeXMLHttpRequest.OPENED);
|
||||
},
|
||||
|
||||
/*
|
||||
Duplicates the behavior of native XMLHttpRequest's setRequestHeader function
|
||||
*/
|
||||
@@ -247,11 +281,16 @@ FakeXMLHttpRequest.prototype = {
|
||||
verifyState(this);
|
||||
|
||||
if (!/^(get|head)$/i.test(this.method)) {
|
||||
if (this.requestHeaders["Content-Type"]) {
|
||||
var value = this.requestHeaders["Content-Type"].split(";");
|
||||
this.requestHeaders["Content-Type"] = value[0] + ";charset=utf-8";
|
||||
} else {
|
||||
this.requestHeaders["Content-Type"] = "text/plain;charset=utf-8";
|
||||
var hasContentTypeHeader = false;
|
||||
|
||||
Object.keys(this.requestHeaders).forEach(function (key) {
|
||||
if (key.toLowerCase() === 'content-type') {
|
||||
hasContentTypeHeader = true;
|
||||
}
|
||||
});
|
||||
|
||||
if (!hasContentTypeHeader && !(data || '').toString().match('FormData')) {
|
||||
this.requestHeaders["Content-Type"] = "text/plain;charset=UTF-8";
|
||||
}
|
||||
|
||||
this.requestBody = data;
|
||||
@@ -274,17 +313,17 @@ FakeXMLHttpRequest.prototype = {
|
||||
abort: function abort() {
|
||||
this.aborted = true;
|
||||
this.responseText = null;
|
||||
this.response = this.responseText;
|
||||
this.errorFlag = true;
|
||||
this.requestHeaders = {};
|
||||
|
||||
this.dispatchEvent(new _Event("abort", false, false, this));
|
||||
|
||||
if (this.readyState > FakeXMLHttpRequest.UNSENT && this.sendFlag) {
|
||||
this._readyStateChange(FakeXMLHttpRequest.DONE);
|
||||
this._readyStateChange(FakeXMLHttpRequest.UNSENT);
|
||||
this.sendFlag = false;
|
||||
}
|
||||
|
||||
this.readyState = FakeXMLHttpRequest.UNSENT;
|
||||
|
||||
this.dispatchEvent(new _Event("abort", false, false, this));
|
||||
if (typeof this.onerror === "function") {
|
||||
this.onerror();
|
||||
}
|
||||
@@ -332,6 +371,16 @@ FakeXMLHttpRequest.prototype = {
|
||||
return headers;
|
||||
},
|
||||
|
||||
/*
|
||||
Duplicates the behavior of native XMLHttpRequest's overrideMimeType function
|
||||
*/
|
||||
overrideMimeType: function overrideMimeType(mimeType) {
|
||||
if (typeof mimeType === "string") {
|
||||
this.forceMimeType = mimeType.toLowerCase();
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
Places a FakeXMLHttpRequest object into the passed
|
||||
state.
|
||||
@@ -340,13 +389,15 @@ FakeXMLHttpRequest.prototype = {
|
||||
this.readyState = state;
|
||||
|
||||
if (typeof this.onreadystatechange == "function") {
|
||||
this.onreadystatechange();
|
||||
this.onreadystatechange(new _Event("readystatechange"));
|
||||
}
|
||||
|
||||
this.dispatchEvent(new _Event("readystatechange"));
|
||||
|
||||
if (this.readyState == FakeXMLHttpRequest.DONE) {
|
||||
this.dispatchEvent(new _Event("load", false, false, this));
|
||||
}
|
||||
if (this.readyState == FakeXMLHttpRequest.UNSENT || this.readyState == FakeXMLHttpRequest.DONE) {
|
||||
this.dispatchEvent(new _Event("loadend", false, false, this));
|
||||
}
|
||||
},
|
||||
@@ -365,6 +416,10 @@ FakeXMLHttpRequest.prototype = {
|
||||
}
|
||||
}
|
||||
|
||||
if (this.forceMimeType) {
|
||||
this.responseHeaders['Content-Type'] = this.forceMimeType;
|
||||
}
|
||||
|
||||
if (this.async) {
|
||||
this._readyStateChange(FakeXMLHttpRequest.HEADERS_RECEIVED);
|
||||
} else {
|
||||
@@ -372,8 +427,6 @@ FakeXMLHttpRequest.prototype = {
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
|
||||
/*
|
||||
Sets the FakeXMLHttpRequest object's response body and
|
||||
if body text is XML, sets responseXML to parsed document
|
||||
@@ -387,6 +440,7 @@ FakeXMLHttpRequest.prototype = {
|
||||
var chunkSize = this.chunkSize || 10;
|
||||
var index = 0;
|
||||
this.responseText = "";
|
||||
this.response = this.responseText;
|
||||
|
||||
do {
|
||||
if (this.async) {
|
||||
@@ -394,6 +448,7 @@ FakeXMLHttpRequest.prototype = {
|
||||
}
|
||||
|
||||
this.responseText += body.substring(index, index + chunkSize);
|
||||
this.response = this.responseText;
|
||||
index += chunkSize;
|
||||
} while (index < body.length);
|
||||
|
||||
@@ -430,13 +485,14 @@ FakeXMLHttpRequest.prototype = {
|
||||
this.status = typeof status == "number" ? status : 200;
|
||||
this.statusText = httpStatusCodes[this.status];
|
||||
this._setResponseBody(body || "");
|
||||
if (typeof this.onload === "function"){
|
||||
this.onload();
|
||||
}
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
function verifyState(xhr) {
|
||||
for (var property in FakeXMLHttpRequestProto) {
|
||||
FakeXMLHttpRequest.prototype[property] = FakeXMLHttpRequestProto[property];
|
||||
}
|
||||
|
||||
function verifyState(xhr) {
|
||||
if (xhr.readyState !== FakeXMLHttpRequest.OPENED) {
|
||||
throw new Error("INVALID_STATE_ERR");
|
||||
}
|
||||
@@ -444,37 +500,31 @@ function verifyState(xhr) {
|
||||
if (xhr.sendFlag) {
|
||||
throw new Error("INVALID_STATE_ERR");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function verifyRequestSent(xhr) {
|
||||
function verifyRequestSent(xhr) {
|
||||
if (xhr.readyState == FakeXMLHttpRequest.DONE) {
|
||||
throw new Error("Request done");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function verifyHeadersReceived(xhr) {
|
||||
function verifyHeadersReceived(xhr) {
|
||||
if (xhr.async && xhr.readyState != FakeXMLHttpRequest.HEADERS_RECEIVED) {
|
||||
throw new Error("No headers received");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function verifyResponseBodyType(body) {
|
||||
function verifyResponseBodyType(body) {
|
||||
if (typeof body != "string") {
|
||||
var error = new Error("Attempted to respond to fake XMLHttpRequest with " +
|
||||
body + ", which is not a string.");
|
||||
error.name = "InvalidBodyException";
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (typeof module !== 'undefined' && module.exports) {
|
||||
module.exports = FakeXMLHttpRequest;
|
||||
} else if (typeof define === 'function' && define.amd) {
|
||||
define(function() { return FakeXMLHttpRequest; });
|
||||
} else if (typeof window !== 'undefined') {
|
||||
window.FakeXMLHttpRequest = FakeXMLHttpRequest;
|
||||
} else if (this) {
|
||||
this.FakeXMLHttpRequest = FakeXMLHttpRequest;
|
||||
}
|
||||
})();
|
||||
return FakeXMLHttpRequest;
|
||||
|
||||
})));
|
||||
//# sourceMappingURL=fake_xml_http_request.js.map
|
||||
|
||||
1839
vendor/assets/javascripts/pretender.js
vendored
1839
vendor/assets/javascripts/pretender.js
vendored
File diff suppressed because it is too large
Load Diff
18
yarn.lock
18
yarn.lock
@@ -1932,10 +1932,10 @@ extract-zip@^1.6.6:
|
||||
mkdirp "^0.5.4"
|
||||
yauzl "^2.10.0"
|
||||
|
||||
fake-xml-http-request@^1.6.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-1.6.0.tgz#bd0ac79ae3e2660098282048a12c730a6f64d550"
|
||||
integrity sha512-99XPwwSg89BfzPuv4XCpZxn3EbauMCgAQCxq9MzrvS6DFD73OON6AnUTicL4A0HZtYMBwCZBWVnRqGjZDgQkTg==
|
||||
fake-xml-http-request@^2.1.2:
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/fake-xml-http-request/-/fake-xml-http-request-2.1.2.tgz#f1786720cae50bbb46273035a0173414f3e85e74"
|
||||
integrity sha512-HaFMBi7r+oEC9iJNpc3bvcW7Z7iLmM26hPDmlb0mFwyANSsOQAtJxbdWsXITKOzZUyMYK0zYCv3h5yDj9TsiXg==
|
||||
|
||||
fast-deep-equal@^3.1.1:
|
||||
version "3.1.3"
|
||||
@@ -3527,12 +3527,12 @@ prelude-ls@~1.1.2:
|
||||
resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54"
|
||||
integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=
|
||||
|
||||
pretender@^1.6:
|
||||
version "1.6.1"
|
||||
resolved "https://registry.yarnpkg.com/pretender/-/pretender-1.6.1.tgz#77d1e42ac8c6b298f5cd43534a87645df035db8c"
|
||||
integrity sha1-d9HkKsjGspj1zUNTSodkXfA124w=
|
||||
pretender@^3.4.7:
|
||||
version "3.4.7"
|
||||
resolved "https://registry.yarnpkg.com/pretender/-/pretender-3.4.7.tgz#34a2ae2d1fc9db440a990d50e6c0f5481d8755fc"
|
||||
integrity sha512-jkPAvt1BfRi0RKamweJdEcnjkeu7Es8yix3bJ+KgBC5VpG/Ln4JE3hYN6vJym4qprm8Xo5adhWpm3HCoft1dOw==
|
||||
dependencies:
|
||||
fake-xml-http-request "^1.6.0"
|
||||
fake-xml-http-request "^2.1.2"
|
||||
route-recognizer "^0.3.3"
|
||||
|
||||
prettier@2.2.1, prettier@^2.0.4:
|
||||
|
||||
Reference in New Issue
Block a user