From 1f69cee296450aa6d07a34a2f5355d408b50f4ed Mon Sep 17 00:00:00 2001 From: Liam Date: Mon, 4 Mar 2024 21:54:09 -0500 Subject: [PATCH] Remove JS polyfills These are no longer needed on any browser we support. --- assets/js/app.js | 8 - assets/js/vendor/closest.polyfill.js | 31 --- assets/js/vendor/customevent.polyfill.js | 17 -- assets/js/vendor/es6.polyfill.js | 104 --------- assets/js/vendor/fetch.polyfill.js | 53 ----- assets/js/vendor/promise.polyfill.js | 225 -------------------- assets/js/vendor/values-entries.polyfill.js | 17 -- 7 files changed, 455 deletions(-) delete mode 100644 assets/js/vendor/closest.polyfill.js delete mode 100644 assets/js/vendor/customevent.polyfill.js delete mode 100644 assets/js/vendor/es6.polyfill.js delete mode 100644 assets/js/vendor/fetch.polyfill.js delete mode 100644 assets/js/vendor/promise.polyfill.js delete mode 100644 assets/js/vendor/values-entries.polyfill.js diff --git a/assets/js/app.js b/assets/js/app.js index 5b1ebab6..a64ec696 100644 --- a/assets/js/app.js +++ b/assets/js/app.js @@ -5,14 +5,6 @@ // the compiled file. // -// Third-party code, polyfills -import './vendor/promise.polyfill'; -import './vendor/fetch.polyfill'; -import './vendor/closest.polyfill'; -import './vendor/customevent.polyfill'; -import './vendor/es6.polyfill'; -import './vendor/values-entries.polyfill'; - // Our code import './ujs'; import './when-ready'; diff --git a/assets/js/vendor/closest.polyfill.js b/assets/js/vendor/closest.polyfill.js deleted file mode 100644 index 2c60a6d5..00000000 --- a/assets/js/vendor/closest.polyfill.js +++ /dev/null @@ -1,31 +0,0 @@ -// element-closest | CC0-1.0 | github.com/jonathantneal/closest - -if (typeof Element.prototype.matches !== 'function') { - Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.mozMatchesSelector || Element.prototype.webkitMatchesSelector || function matches(selector) { - var element = this; - var elements = (element.document || element.ownerDocument).querySelectorAll(selector); - var index = 0; - - while (elements[index] && elements[index] !== element) { - ++index; - } - - return Boolean(elements[index]); - }; -} - -if (typeof Element.prototype.closest !== 'function') { - Element.prototype.closest = function closest(selector) { - var element = this; - - while (element && element.nodeType === 1) { - if (element.matches(selector)) { - return element; - } - - element = element.parentNode; - } - - return null; - }; -} diff --git a/assets/js/vendor/customevent.polyfill.js b/assets/js/vendor/customevent.polyfill.js deleted file mode 100644 index 7d13f9cf..00000000 --- a/assets/js/vendor/customevent.polyfill.js +++ /dev/null @@ -1,17 +0,0 @@ -// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent - -(function () { - - if ( typeof window.CustomEvent === "function" ) return false; - - function CustomEvent ( event, params ) { - params = params || { bubbles: false, cancelable: false, detail: undefined }; - var evt = document.createEvent( 'CustomEvent' ); - evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); - return evt; - } - - CustomEvent.prototype = window.Event.prototype; - - window.CustomEvent = CustomEvent; -})(); diff --git a/assets/js/vendor/es6.polyfill.js b/assets/js/vendor/es6.polyfill.js deleted file mode 100644 index 51c1c423..00000000 --- a/assets/js/vendor/es6.polyfill.js +++ /dev/null @@ -1,104 +0,0 @@ -/** - * ES6 methods polyfill - * Sourced from their respective articles on MDN - */ - -if (!Array.prototype.find) { - Array.prototype.find = function(predicate) { - 'use strict'; - if (this == null) { - throw new TypeError('Array.prototype.find called on null or undefined'); - } - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - - for (var i = 0; i < length; i++) { - value = list[i]; - if (predicate.call(thisArg, value, i, list)) { - return value; - } - } - return undefined; - }; -} - -if (!Array.prototype.findIndex) { - Array.prototype.findIndex = function(predicate) { - 'use strict'; - if (this == null) { - throw new TypeError('Array.prototype.findIndex called on null or undefined'); - } - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - - for (var i = 0; i < length; i++) { - value = list[i]; - if (predicate.call(thisArg, value, i, list)) { - return i; - } - } - return -1; - }; -} - -if (!Array.prototype.includes) { - Array.prototype.includes = function(searchElement /*, fromIndex*/) { - 'use strict'; - if (this == null) { - throw new TypeError('Array.prototype.includes called on null or undefined'); - } - - var O = Object(this); - var len = parseInt(O.length, 10) || 0; - if (len === 0) { - return false; - } - var n = parseInt(arguments[1], 10) || 0; - var k; - if (n >= 0) { - k = n; - } else { - k = len + n; - if (k < 0) {k = 0;} - } - var currentElement; - while (k < len) { - currentElement = O[k]; - if (searchElement === currentElement || - (searchElement !== searchElement && currentElement !== currentElement)) { // NaN !== NaN - return true; - } - k++; - } - return false; - }; -} - -if (!String.prototype.startsWith) { - String.prototype.startsWith = function(searchString, position){ - position = position || 0; - return this.substr(position, searchString.length) === searchString; - }; -} - -if (!String.prototype.endsWith) { - String.prototype.endsWith = function(searchString, position) { - var subjectString = this.toString(); - if (typeof position !== 'number' || !isFinite(position) || Math.floor(position) !== position || position > subjectString.length) { - position = subjectString.length; - } - position -= searchString.length; - var lastIndex = subjectString.lastIndexOf(searchString, position); - return lastIndex !== -1 && lastIndex === position; - }; -} diff --git a/assets/js/vendor/fetch.polyfill.js b/assets/js/vendor/fetch.polyfill.js deleted file mode 100644 index 456f8c1f..00000000 --- a/assets/js/vendor/fetch.polyfill.js +++ /dev/null @@ -1,53 +0,0 @@ -if (typeof window.fetch !== 'function') { - window.fetch = function fetch(url, options) { - return new Promise((resolve, reject) => { - let request = new XMLHttpRequest(); - - options = options || {}; - request.open(options.method || 'GET', url); - - for (const i in options.headers) { - request.setRequestHeader(i, options.headers[i]); - } - - request.withCredentials = options.credentials === 'include' || options.credentials === 'same-origin'; - request.onload = () => resolve(response()); - request.onerror = reject; - - // IE11 hack: don't send null/undefined - if (options.body != null) - request.send(options.body); - else - request.send(); - - function response() { - const keys = [], all = [], headers = {}; - let header; - - request.getAllResponseHeaders().replace(/^(.*?):\s*([\s\S]*?)$/gm, (m, key, value) => { - keys.push(key = key.toLowerCase()); - all.push([key, value]); - header = headers[key]; - headers[key] = header ? `${header},${value}` : value; - }); - - return { - ok: (request.status/200|0) === 1, - status: request.status, - statusText: request.statusText, - url: request.responseURL, - clone: response, - text: () => Promise.resolve(request.responseText), - json: () => Promise.resolve(request.responseText).then(JSON.parse), - blob: () => Promise.resolve(new Blob([request.response])), - headers: { - keys: () => keys, - entries: () => all, - get: n => headers[n.toLowerCase()], - has: n => n.toLowerCase() in headers - } - }; - } - }); - }; -} diff --git a/assets/js/vendor/promise.polyfill.js b/assets/js/vendor/promise.polyfill.js deleted file mode 100644 index e02758e3..00000000 --- a/assets/js/vendor/promise.polyfill.js +++ /dev/null @@ -1,225 +0,0 @@ -(function (root) { - if (root.Promise) return; - - // Store setTimeout reference so promise-polyfill will be unaffected by - // other code modifying setTimeout (like sinon.useFakeTimers()) - var setTimeoutFunc = setTimeout; - - function noop() { - } - - // Use polyfill for setImmediate for performance gains - function asap(fn) { - setTimeoutFunc(fn, 1); - } - - var onUnhandledRejection = function onUnhandledRejection(err) { - console.warn('Possible Unhandled Promise Rejection:', err); // eslint-disable-line no-console - }; - - // Polyfill for Function.prototype.bind - function bind(fn, thisArg) { - return function () { - fn.apply(thisArg, arguments); - }; - } - - var isArray = Array.isArray || function (value) { - return Object.prototype.toString.call(value) === '[object Array]'; - }; - - function Promise(fn) { - if (typeof this !== 'object') throw new TypeError('Promises must be constructed via new'); - if (typeof fn !== 'function') throw new TypeError('not a function'); - this._state = 0; - this._handled = false; - this._value = undefined; - this._deferreds = []; - - doResolve(fn, this); - } - - function handle(self, deferred) { - while (self._state === 3) { - self = self._value; - } - if (self._state === 0) { - self._deferreds.push(deferred); - return; - } - self._handled = true; - asap(function () { - var cb = self._state === 1 ? deferred.onFulfilled : deferred.onRejected; - if (cb === null) { - (self._state === 1 ? resolve : reject)(deferred.promise, self._value); - return; - } - var ret; - try { - ret = cb(self._value); - } catch (e) { - reject(deferred.promise, e); - return; - } - resolve(deferred.promise, ret); - }); - } - - function resolve(self, newValue) { - try { - // Promise Resolution Procedure: https://github.com/promises-aplus/promises-spec#the-promise-resolution-procedure - if (newValue === self) throw new TypeError('A promise cannot be resolved with itself.'); - if (newValue && (typeof newValue === 'object' || typeof newValue === 'function')) { - var then = newValue.then; - if (newValue instanceof Promise) { - self._state = 3; - self._value = newValue; - finale(self); - return; - } else if (typeof then === 'function') { - doResolve(bind(then, newValue), self); - return; - } - } - self._state = 1; - self._value = newValue; - finale(self); - } catch (e) { - reject(self, e); - } - } - - function reject(self, newValue) { - self._state = 2; - self._value = newValue; - finale(self); - } - - function finale(self) { - if (self._state === 2 && self._deferreds.length === 0) { - setTimeout(function() { - if (!self._handled) { - onUnhandledRejection(self._value); - } - }, 1); - } - - for (var i = 0, len = self._deferreds.length; i < len; i++) { - handle(self, self._deferreds[i]); - } - self._deferreds = null; - } - - function Handler(onFulfilled, onRejected, promise) { - this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; - this.onRejected = typeof onRejected === 'function' ? onRejected : null; - this.promise = promise; - } - - /** - * Take a potentially misbehaving resolver function and make sure - * onFulfilled and onRejected are only called once. - * - * Makes no guarantees about asynchrony. - */ - function doResolve(fn, self) { - var done = false; - try { - fn(function (value) { - if (done) return; - done = true; - resolve(self, value); - }, function (reason) { - if (done) return; - done = true; - reject(self, reason); - }); - } catch (ex) { - if (done) return; - done = true; - reject(self, ex); - } - } - - Promise.prototype['catch'] = function (onRejected) { - return this.then(null, onRejected); - }; - - Promise.prototype.then = function (onFulfilled, onRejected) { - var prom = new Promise(noop); - handle(this, new Handler(onFulfilled, onRejected, prom)); - return prom; - }; - - Promise.all = function () { - var args = Array.prototype.slice.call(arguments.length === 1 && isArray(arguments[0]) ? arguments[0] : arguments); - - return new Promise(function (resolve, reject) { - if (args.length === 0) return resolve([]); - var remaining = args.length; - - function res(i, val) { - try { - if (val && (typeof val === 'object' || typeof val === 'function')) { - var then = val.then; - if (typeof then === 'function') { - then.call(val, function (val) { - res(i, val); - }, reject); - return; - } - } - args[i] = val; - if (--remaining === 0) { - resolve(args); - } - } catch (ex) { - reject(ex); - } - } - - for (var i = 0; i < args.length; i++) { - res(i, args[i]); - } - }); - }; - - Promise.resolve = function (value) { - if (value && typeof value === 'object' && value.constructor === Promise) { - return value; - } - - return new Promise(function (resolve) { - resolve(value); - }); - }; - - Promise.reject = function (value) { - return new Promise(function (resolve, reject) { - reject(value); - }); - }; - - Promise.race = function (values) { - return new Promise(function (resolve, reject) { - for (var i = 0, len = values.length; i < len; i++) { - values[i].then(resolve, reject); - } - }); - }; - - /** - * Set the immediate function to execute callbacks - * @param fn {function} Function to execute - * @private - */ - Promise._setImmediateFn = function _setImmediateFn(fn) { - asap = fn; - }; - - Promise._setUnhandledRejectionFn = function _setUnhandledRejectionFn(fn) { - onUnhandledRejection = fn; - }; - - root.Promise = Promise; -})(window); diff --git a/assets/js/vendor/values-entries.polyfill.js b/assets/js/vendor/values-entries.polyfill.js deleted file mode 100644 index c8896e2f..00000000 --- a/assets/js/vendor/values-entries.polyfill.js +++ /dev/null @@ -1,17 +0,0 @@ -// object-values | MIT | github.com/tc39/proposal-object-values-entries - -const reduce = Function.bind.call(Function.call, Array.prototype.reduce); -const isEnumerable = Function.bind.call(Function.call, Object.prototype.propertyIsEnumerable); -const concat = Function.bind.call(Function.call, Array.prototype.concat); - -if (!Object.values) { - Object.values = function values(O) { - return reduce(Object.keys(O), (v, k) => concat(v, typeof k === 'string' && isEnumerable(O, k) ? [O[k]] : []), []); - }; -} - -if (!Object.entries) { - Object.entries = function entries(O) { - return reduce(Object.keys(O), (e, k) => concat(e, typeof k === 'string' && isEnumerable(O, k) ? [[k, O[k]]] : []), []); - }; -}