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.
178 lines
5.4 KiB
178 lines
5.4 KiB
2 years ago
|
'use strict'
|
||
|
|
||
|
/**
|
||
|
* Ponyfill for `Array.prototype.find` which is only available in ES6 runtimes.
|
||
|
*
|
||
|
* Works with anything that has a `length` property and index access properties, including NodeList.
|
||
|
*
|
||
|
* @template {unknown} T
|
||
|
* @param {Array<T> | ({length:number, [number]: T})} list
|
||
|
* @param {function (item: T, index: number, list:Array<T> | ({length:number, [number]: T})):boolean} predicate
|
||
|
* @param {Partial<Pick<ArrayConstructor['prototype'], 'find'>>?} ac `Array.prototype` by default,
|
||
|
* allows injecting a custom implementation in tests
|
||
|
* @returns {T | undefined}
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find
|
||
|
* @see https://tc39.es/ecma262/multipage/indexed-collections.html#sec-array.prototype.find
|
||
|
*/
|
||
|
function find(list, predicate, ac) {
|
||
|
if (ac === undefined) {
|
||
|
ac = Array.prototype;
|
||
|
}
|
||
|
if (list && typeof ac.find === 'function') {
|
||
|
return ac.find.call(list, predicate);
|
||
|
}
|
||
|
for (var i = 0; i < list.length; i++) {
|
||
|
if (Object.prototype.hasOwnProperty.call(list, i)) {
|
||
|
var item = list[i];
|
||
|
if (predicate.call(undefined, item, i, list)) {
|
||
|
return item;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* "Shallow freezes" an object to render it immutable.
|
||
|
* Uses `Object.freeze` if available,
|
||
|
* otherwise the immutability is only in the type.
|
||
|
*
|
||
|
* Is used to create "enum like" objects.
|
||
|
*
|
||
|
* @template T
|
||
|
* @param {T} object the object to freeze
|
||
|
* @param {Pick<ObjectConstructor, 'freeze'> = Object} oc `Object` by default,
|
||
|
* allows to inject custom object constructor for tests
|
||
|
* @returns {Readonly<T>}
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/freeze
|
||
|
*/
|
||
|
function freeze(object, oc) {
|
||
|
if (oc === undefined) {
|
||
|
oc = Object
|
||
|
}
|
||
|
return oc && typeof oc.freeze === 'function' ? oc.freeze(object) : object
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* All mime types that are allowed as input to `DOMParser.parseFromString`
|
||
|
*
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString#Argument02 MDN
|
||
|
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#domparsersupportedtype WHATWG HTML Spec
|
||
|
* @see DOMParser.prototype.parseFromString
|
||
|
*/
|
||
|
var MIME_TYPE = freeze({
|
||
|
/**
|
||
|
* `text/html`, the only mime type that triggers treating an XML document as HTML.
|
||
|
*
|
||
|
* @see DOMParser.SupportedType.isHTML
|
||
|
* @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration
|
||
|
* @see https://en.wikipedia.org/wiki/HTML Wikipedia
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN
|
||
|
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring WHATWG HTML Spec
|
||
|
*/
|
||
|
HTML: 'text/html',
|
||
|
|
||
|
/**
|
||
|
* Helper method to check a mime type if it indicates an HTML document
|
||
|
*
|
||
|
* @param {string} [value]
|
||
|
* @returns {boolean}
|
||
|
*
|
||
|
* @see https://www.iana.org/assignments/media-types/text/html IANA MimeType registration
|
||
|
* @see https://en.wikipedia.org/wiki/HTML Wikipedia
|
||
|
* @see https://developer.mozilla.org/en-US/docs/Web/API/DOMParser/parseFromString MDN
|
||
|
* @see https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-domparser-parsefromstring */
|
||
|
isHTML: function (value) {
|
||
|
return value === MIME_TYPE.HTML
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* `application/xml`, the standard mime type for XML documents.
|
||
|
*
|
||
|
* @see https://www.iana.org/assignments/media-types/application/xml IANA MimeType registration
|
||
|
* @see https://tools.ietf.org/html/rfc7303#section-9.1 RFC 7303
|
||
|
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||
|
*/
|
||
|
XML_APPLICATION: 'application/xml',
|
||
|
|
||
|
/**
|
||
|
* `text/html`, an alias for `application/xml`.
|
||
|
*
|
||
|
* @see https://tools.ietf.org/html/rfc7303#section-9.2 RFC 7303
|
||
|
* @see https://www.iana.org/assignments/media-types/text/xml IANA MimeType registration
|
||
|
* @see https://en.wikipedia.org/wiki/XML_and_MIME Wikipedia
|
||
|
*/
|
||
|
XML_TEXT: 'text/xml',
|
||
|
|
||
|
/**
|
||
|
* `application/xhtml+xml`, indicates an XML document that has the default HTML namespace,
|
||
|
* but is parsed as an XML document.
|
||
|
*
|
||
|
* @see https://www.iana.org/assignments/media-types/application/xhtml+xml IANA MimeType registration
|
||
|
* @see https://dom.spec.whatwg.org/#dom-domimplementation-createdocument WHATWG DOM Spec
|
||
|
* @see https://en.wikipedia.org/wiki/XHTML Wikipedia
|
||
|
*/
|
||
|
XML_XHTML_APPLICATION: 'application/xhtml+xml',
|
||
|
|
||
|
/**
|
||
|
* `image/svg+xml`,
|
||
|
*
|
||
|
* @see https://www.iana.org/assignments/media-types/image/svg+xml IANA MimeType registration
|
||
|
* @see https://www.w3.org/TR/SVG11/ W3C SVG 1.1
|
||
|
* @see https://en.wikipedia.org/wiki/Scalable_Vector_Graphics Wikipedia
|
||
|
*/
|
||
|
XML_SVG_IMAGE: 'image/svg+xml',
|
||
|
})
|
||
|
|
||
|
/**
|
||
|
* Namespaces that are used in this code base.
|
||
|
*
|
||
|
* @see http://www.w3.org/TR/REC-xml-names
|
||
|
*/
|
||
|
var NAMESPACE = freeze({
|
||
|
/**
|
||
|
* The XHTML namespace.
|
||
|
*
|
||
|
* @see http://www.w3.org/1999/xhtml
|
||
|
*/
|
||
|
HTML: 'http://www.w3.org/1999/xhtml',
|
||
|
|
||
|
/**
|
||
|
* Checks if `uri` equals `NAMESPACE.HTML`.
|
||
|
*
|
||
|
* @param {string} [uri]
|
||
|
*
|
||
|
* @see NAMESPACE.HTML
|
||
|
*/
|
||
|
isHTML: function (uri) {
|
||
|
return uri === NAMESPACE.HTML
|
||
|
},
|
||
|
|
||
|
/**
|
||
|
* The SVG namespace.
|
||
|
*
|
||
|
* @see http://www.w3.org/2000/svg
|
||
|
*/
|
||
|
SVG: 'http://www.w3.org/2000/svg',
|
||
|
|
||
|
/**
|
||
|
* The `xml:` namespace.
|
||
|
*
|
||
|
* @see http://www.w3.org/XML/1998/namespace
|
||
|
*/
|
||
|
XML: 'http://www.w3.org/XML/1998/namespace',
|
||
|
|
||
|
/**
|
||
|
* The `xmlns:` namespace
|
||
|
*
|
||
|
* @see https://www.w3.org/2000/xmlns/
|
||
|
*/
|
||
|
XMLNS: 'http://www.w3.org/2000/xmlns/',
|
||
|
})
|
||
|
|
||
|
exports.find = find;
|
||
|
exports.freeze = freeze;
|
||
|
exports.MIME_TYPE = MIME_TYPE;
|
||
|
exports.NAMESPACE = NAMESPACE;
|