govuk_tech_docs 3.4.0 → 3.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -1
  3. data/lib/assets/stylesheets/_govuk_tech_docs.scss +13 -0
  4. data/lib/govuk_tech_docs/version.rb +1 -1
  5. data/lib/source/favicon.ico +0 -0
  6. data/lib/source/layouts/_header.erb +13 -15
  7. data/node_modules/govuk-frontend/govuk/all-ie8.scss +8 -0
  8. data/node_modules/govuk-frontend/govuk/all.js +4918 -3796
  9. data/node_modules/govuk-frontend/govuk/common/closest-attribute-value.js +54 -49
  10. data/node_modules/govuk-frontend/govuk/common/govuk-frontend-version.js +17 -0
  11. data/node_modules/govuk-frontend/govuk/common/index.js +172 -152
  12. data/node_modules/govuk-frontend/govuk/common/normalise-dataset.js +334 -321
  13. data/node_modules/govuk-frontend/govuk/common.js +171 -151
  14. data/node_modules/govuk-frontend/govuk/components/_all.scss +3 -2
  15. data/node_modules/govuk-frontend/govuk/components/accordion/_index.scss +26 -7
  16. data/node_modules/govuk-frontend/govuk/components/accordion/accordion.js +2203 -1650
  17. data/node_modules/govuk-frontend/govuk/components/back-link/_index.scss +24 -16
  18. data/node_modules/govuk-frontend/govuk/components/breadcrumbs/_index.scss +34 -11
  19. data/node_modules/govuk-frontend/govuk/components/button/_index.scss +49 -9
  20. data/node_modules/govuk-frontend/govuk/components/button/button.js +961 -916
  21. data/node_modules/govuk-frontend/govuk/components/character-count/character-count.js +2142 -2038
  22. data/node_modules/govuk-frontend/govuk/components/checkboxes/_index.scss +6 -6
  23. data/node_modules/govuk-frontend/govuk/components/checkboxes/checkboxes.js +1204 -1145
  24. data/node_modules/govuk-frontend/govuk/components/details/details.js +826 -799
  25. data/node_modules/govuk-frontend/govuk/components/error-summary/error-summary.js +1097 -1044
  26. data/node_modules/govuk-frontend/govuk/components/exit-this-page/_exit-this-page.scss +2 -0
  27. data/node_modules/govuk-frontend/govuk/components/exit-this-page/_index.scss +97 -0
  28. data/node_modules/govuk-frontend/govuk/components/exit-this-page/exit-this-page.js +2120 -0
  29. data/node_modules/govuk-frontend/govuk/components/file-upload/_index.scss +6 -1
  30. data/node_modules/govuk-frontend/govuk/components/footer/_index.scss +0 -7
  31. data/node_modules/govuk-frontend/govuk/components/header/_index.scss +6 -0
  32. data/node_modules/govuk-frontend/govuk/components/header/header.js +683 -1003
  33. data/node_modules/govuk-frontend/govuk/components/input/_index.scss +15 -3
  34. data/node_modules/govuk-frontend/govuk/components/notification-banner/notification-banner.js +786 -751
  35. data/node_modules/govuk-frontend/govuk/components/radios/_index.scss +5 -5
  36. data/node_modules/govuk-frontend/govuk/components/radios/radios.js +1151 -1105
  37. data/node_modules/govuk-frontend/govuk/components/select/_index.scss +7 -1
  38. data/node_modules/govuk-frontend/govuk/components/skip-link/skip-link.js +1045 -1014
  39. data/node_modules/govuk-frontend/govuk/components/summary-list/_index.scss +107 -0
  40. data/node_modules/govuk-frontend/govuk/components/tabs/tabs.js +1514 -1268
  41. data/node_modules/govuk-frontend/govuk/components/tag/_index.scss +18 -18
  42. data/node_modules/govuk-frontend/govuk/components/textarea/_index.scss +8 -1
  43. data/node_modules/govuk-frontend/govuk/core/_all.scss +1 -0
  44. data/node_modules/govuk-frontend/govuk/core/_govuk-frontend-version.scss +5 -0
  45. data/node_modules/govuk-frontend/govuk/helpers/_colour.scss +5 -2
  46. data/node_modules/govuk-frontend/govuk/helpers/_focused.scss +1 -1
  47. data/node_modules/govuk-frontend/govuk/helpers/_font-faces.scss +1 -1
  48. data/node_modules/govuk-frontend/govuk/helpers/_visually-hidden.scss +12 -0
  49. data/node_modules/govuk-frontend/govuk/i18n.js +371 -364
  50. data/node_modules/govuk-frontend/govuk/objects/_template.scss +20 -0
  51. data/node_modules/govuk-frontend/govuk/objects/_width-container.scss +1 -1
  52. data/node_modules/govuk-frontend/govuk/settings/_colours-organisations.scss +4 -0
  53. data/node_modules/govuk-frontend/govuk/settings/_ie8.scss +16 -0
  54. data/node_modules/govuk-frontend/govuk/settings/_links.scss +5 -1
  55. data/node_modules/govuk-frontend/govuk/settings/_measurements.scss +5 -5
  56. data/node_modules/govuk-frontend/govuk/tools/_ie8.scss +38 -2
  57. data/node_modules/govuk-frontend/govuk/vendor/polyfills/DOMTokenList.js +243 -241
  58. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Date/now.js +14 -12
  59. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Document.js +18 -16
  60. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/classList.js +553 -545
  61. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/closest.js +40 -36
  62. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/dataset.js +257 -250
  63. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/matches.js +22 -20
  64. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/nextElementSibling.js +204 -197
  65. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element/prototype/previousElementSibling.js +204 -197
  66. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Element.js +109 -105
  67. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Event.js +407 -399
  68. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Function/prototype/bind.js +242 -238
  69. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Object/defineProperty.js +73 -71
  70. data/node_modules/govuk-frontend/govuk/vendor/polyfills/String/prototype/trim.js +15 -13
  71. data/node_modules/govuk-frontend/govuk/vendor/polyfills/Window.js +18 -16
  72. data/node_modules/govuk-frontend/govuk-prototype-kit/init.js +1 -0
  73. data/package-lock.json +7 -7
  74. data/package.json +1 -1
  75. metadata +8 -3
@@ -1,1136 +1,1189 @@
1
1
  (function (global, factory) {
2
- typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
- typeof define === 'function' && define.amd ? define('GOVUKFrontend.ErrorSummary', factory) :
4
- (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.ErrorSummary = factory());
2
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
3
+ typeof define === 'function' && define.amd ? define('GOVUKFrontend.ErrorSummary', factory) :
4
+ (global.GOVUKFrontend = global.GOVUKFrontend || {}, global.GOVUKFrontend.ErrorSummary = factory());
5
5
  }(this, (function () { 'use strict';
6
6
 
7
- (function(undefined) {
8
-
9
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
10
- var detect = (
11
- // In IE8, defineProperty could only act on DOM elements, so full support
12
- // for the feature requires the ability to set a property on an arbitrary object
13
- 'defineProperty' in Object && (function() {
14
- try {
15
- var a = {};
16
- Object.defineProperty(a, 'test', {value:42});
17
- return true;
18
- } catch(e) {
19
- return false
20
- }
21
- }())
22
- );
23
-
24
- if (detect) return
25
-
26
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
27
- (function (nativeDefineProperty) {
28
-
29
- var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
30
- var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
31
- var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
32
-
33
- Object.defineProperty = function defineProperty(object, property, descriptor) {
34
-
35
- // Where native support exists, assume it
36
- if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
37
- return nativeDefineProperty(object, property, descriptor);
38
- }
39
-
40
- if (object === null || !(object instanceof Object || typeof object === 'object')) {
41
- throw new TypeError('Object.defineProperty called on non-object');
42
- }
43
-
44
- if (!(descriptor instanceof Object)) {
45
- throw new TypeError('Property description must be an object');
46
- }
47
-
48
- var propertyString = String(property);
49
- var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
50
- var getterType = 'get' in descriptor && typeof descriptor.get;
51
- var setterType = 'set' in descriptor && typeof descriptor.set;
52
-
53
- // handle descriptor.get
54
- if (getterType) {
55
- if (getterType !== 'function') {
56
- throw new TypeError('Getter must be a function');
57
- }
58
- if (!supportsAccessors) {
59
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
60
- }
61
- if (hasValueOrWritable) {
62
- throw new TypeError(ERR_VALUE_ACCESSORS);
63
- }
64
- Object.__defineGetter__.call(object, propertyString, descriptor.get);
65
- } else {
66
- object[propertyString] = descriptor.value;
67
- }
68
-
69
- // handle descriptor.set
70
- if (setterType) {
71
- if (setterType !== 'function') {
72
- throw new TypeError('Setter must be a function');
73
- }
74
- if (!supportsAccessors) {
75
- throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
76
- }
77
- if (hasValueOrWritable) {
78
- throw new TypeError(ERR_VALUE_ACCESSORS);
79
- }
80
- Object.__defineSetter__.call(object, propertyString, descriptor.set);
81
- }
82
-
83
- // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
84
- if ('value' in descriptor) {
85
- object[propertyString] = descriptor.value;
86
- }
87
-
88
- return object;
89
- };
90
- }(Object.defineProperty));
91
- })
92
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
93
-
94
- (function(undefined) {
95
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
96
- var detect = 'bind' in Function.prototype;
97
-
98
- if (detect) return
7
+ /**
8
+ * Common helpers which do not require polyfill.
9
+ *
10
+ * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
11
+ * so that the polyfill can be properly tree-shaken and does not burden
12
+ * the components that do not need that helper
13
+ *
14
+ * @module common/index
15
+ */
99
16
 
100
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
101
- Object.defineProperty(Function.prototype, 'bind', {
102
- value: function bind(that) { // .length is 1
103
- // add necessary es5-shim utilities
104
- var $Array = Array;
105
- var $Object = Object;
106
- var ObjectPrototype = $Object.prototype;
107
- var ArrayPrototype = $Array.prototype;
108
- var Empty = function Empty() {};
109
- var to_string = ObjectPrototype.toString;
110
- var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
111
- var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
112
- var array_slice = ArrayPrototype.slice;
113
- var array_concat = ArrayPrototype.concat;
114
- var array_push = ArrayPrototype.push;
115
- var max = Math.max;
116
- // /add necessary es5-shim utilities
117
-
118
- // 1. Let Target be the this value.
119
- var target = this;
120
- // 2. If IsCallable(Target) is false, throw a TypeError exception.
121
- if (!isCallable(target)) {
122
- throw new TypeError('Function.prototype.bind called on incompatible ' + target);
17
+ /**
18
+ * Config flattening function
19
+ *
20
+ * Takes any number of objects, flattens them into namespaced key-value pairs,
21
+ * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
22
+ * greatest priority on the LAST item passed in.
23
+ *
24
+ * @deprecated Will be made private in v5.0
25
+ * @returns {Object<string, unknown>} A flattened object of key-value pairs.
26
+ */
27
+ function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
28
+ /**
29
+ * Function to take nested objects and flatten them to a dot-separated keyed
30
+ * object. Doing this means we don't need to do any deep/recursive merging of
31
+ * each of our objects, nor transform our dataset from a flat list into a
32
+ * nested object.
33
+ *
34
+ * @param {Object<string, unknown>} configObject - Deeply nested object
35
+ * @returns {Object<string, unknown>} Flattened object with dot-separated keys
36
+ */
37
+ var flattenObject = function (configObject) {
38
+ // Prepare an empty return object
39
+ /** @type {Object<string, unknown>} */
40
+ var flattenedObject = {};
41
+
42
+ /**
43
+ * Our flattening function, this is called recursively for each level of
44
+ * depth in the object. At each level we prepend the previous level names to
45
+ * the key using `prefix`.
46
+ *
47
+ * @param {Partial<Object<string, unknown>>} obj - Object to flatten
48
+ * @param {string} [prefix] - Optional dot-separated prefix
49
+ */
50
+ var flattenLoop = function (obj, prefix) {
51
+ // Loop through keys...
52
+ for (var key in obj) {
53
+ // Check to see if this is a prototypical key/value,
54
+ // if it is, skip it.
55
+ if (!Object.prototype.hasOwnProperty.call(obj, key)) {
56
+ continue
123
57
  }
124
- // 3. Let A be a new (possibly empty) internal list of all of the
125
- // argument values provided after thisArg (arg1, arg2 etc), in order.
126
- // XXX slicedArgs will stand in for "A" if used
127
- var args = array_slice.call(arguments, 1); // for normal call
128
- // 4. Let F be a new native ECMAScript object.
129
- // 11. Set the [[Prototype]] internal property of F to the standard
130
- // built-in Function prototype object as specified in 15.3.3.1.
131
- // 12. Set the [[Call]] internal property of F as described in
132
- // 15.3.4.5.1.
133
- // 13. Set the [[Construct]] internal property of F as described in
134
- // 15.3.4.5.2.
135
- // 14. Set the [[HasInstance]] internal property of F as described in
136
- // 15.3.4.5.3.
137
- var bound;
138
- var binder = function () {
139
-
140
- if (this instanceof bound) {
141
- // 15.3.4.5.2 [[Construct]]
142
- // When the [[Construct]] internal method of a function object,
143
- // F that was created using the bind function is called with a
144
- // list of arguments ExtraArgs, the following steps are taken:
145
- // 1. Let target be the value of F's [[TargetFunction]]
146
- // internal property.
147
- // 2. If target has no [[Construct]] internal method, a
148
- // TypeError exception is thrown.
149
- // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
150
- // property.
151
- // 4. Let args be a new list containing the same values as the
152
- // list boundArgs in the same order followed by the same
153
- // values as the list ExtraArgs in the same order.
154
- // 5. Return the result of calling the [[Construct]] internal
155
- // method of target providing args as the arguments.
156
-
157
- var result = target.apply(
158
- this,
159
- array_concat.call(args, array_slice.call(arguments))
160
- );
161
- if ($Object(result) === result) {
162
- return result;
163
- }
164
- return this;
165
-
166
- } else {
167
- // 15.3.4.5.1 [[Call]]
168
- // When the [[Call]] internal method of a function object, F,
169
- // which was created using the bind function is called with a
170
- // this value and a list of arguments ExtraArgs, the following
171
- // steps are taken:
172
- // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
173
- // property.
174
- // 2. Let boundThis be the value of F's [[BoundThis]] internal
175
- // property.
176
- // 3. Let target be the value of F's [[TargetFunction]] internal
177
- // property.
178
- // 4. Let args be a new list containing the same values as the
179
- // list boundArgs in the same order followed by the same
180
- // values as the list ExtraArgs in the same order.
181
- // 5. Return the result of calling the [[Call]] internal method
182
- // of target providing boundThis as the this value and
183
- // providing args as the arguments.
184
-
185
- // equiv: target.call(this, ...boundArgs, ...args)
186
- return target.apply(
187
- that,
188
- array_concat.call(args, array_slice.call(arguments))
189
- );
190
-
191
- }
192
-
193
- };
194
-
195
- // 15. If the [[Class]] internal property of Target is "Function", then
196
- // a. Let L be the length property of Target minus the length of A.
197
- // b. Set the length own property of F to either 0 or L, whichever is
198
- // larger.
199
- // 16. Else set the length own property of F to 0.
200
-
201
- var boundLength = max(0, target.length - args.length);
202
-
203
- // 17. Set the attributes of the length own property of F to the values
204
- // specified in 15.3.5.1.
205
- var boundArgs = [];
206
- for (var i = 0; i < boundLength; i++) {
207
- array_push.call(boundArgs, '$' + i);
58
+ var value = obj[key];
59
+ var prefixedKey = prefix ? prefix + '.' + key : key;
60
+ if (typeof value === 'object') {
61
+ // If the value is a nested object, recurse over that too
62
+ flattenLoop(value, prefixedKey);
63
+ } else {
64
+ // Otherwise, add this value to our return object
65
+ flattenedObject[prefixedKey] = value;
208
66
  }
67
+ }
68
+ };
209
69
 
210
- // XXX Build a dynamic function with desired amount of arguments is the only
211
- // way to set the length property of a function.
212
- // In environments where Content Security Policies enabled (Chrome extensions,
213
- // for ex.) all use of eval or Function costructor throws an exception.
214
- // However in all of these environments Function.prototype.bind exists
215
- // and so this code will never be executed.
216
- bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
217
-
218
- if (target.prototype) {
219
- Empty.prototype = target.prototype;
220
- bound.prototype = new Empty();
221
- // Clean up dangling references.
222
- Empty.prototype = null;
223
- }
70
+ // Kick off the recursive loop
71
+ flattenLoop(configObject);
72
+ return flattenedObject
73
+ };
224
74
 
225
- // TODO
226
- // 18. Set the [[Extensible]] internal property of F to true.
227
-
228
- // TODO
229
- // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
230
- // 20. Call the [[DefineOwnProperty]] internal method of F with
231
- // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
232
- // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
233
- // false.
234
- // 21. Call the [[DefineOwnProperty]] internal method of F with
235
- // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
236
- // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
237
- // and false.
238
-
239
- // TODO
240
- // NOTE Function objects created using Function.prototype.bind do not
241
- // have a prototype property or the [[Code]], [[FormalParameters]], and
242
- // [[Scope]] internal properties.
243
- // XXX can't delete prototype in pure-js.
244
-
245
- // 22. Return F.
246
- return bound;
75
+ // Start with an empty object as our base
76
+ /** @type {Object<string, unknown>} */
77
+ var formattedConfigObject = {};
78
+
79
+ // Loop through each of the remaining passed objects and push their keys
80
+ // one-by-one into configObject. Any duplicate keys will override the existing
81
+ // key with the new value.
82
+ for (var i = 0; i < arguments.length; i++) {
83
+ var obj = flattenObject(arguments[i]);
84
+ for (var key in obj) {
85
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
86
+ formattedConfigObject[key] = obj[key];
87
+ }
247
88
  }
248
- });
249
- })
250
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
89
+ }
251
90
 
252
- (function(undefined) {
91
+ return formattedConfigObject
92
+ }
253
93
 
254
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
255
- var detect = ('Window' in this);
94
+ /**
95
+ * @template {Node} ElementType
96
+ * @callback nodeListIterator
97
+ * @param {ElementType} value - The current node being iterated on
98
+ * @param {number} index - The current index in the iteration
99
+ * @param {NodeListOf<ElementType>} nodes - NodeList from querySelectorAll()
100
+ * @returns {void}
101
+ */
256
102
 
257
- if (detect) return
103
+ // @ts-nocheck
104
+ (function (undefined) {
258
105
 
259
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
260
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
261
- (function (global) {
262
- if (global.constructor) {
263
- global.Window = global.constructor;
264
- } else {
265
- (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
266
- }
267
- }(this));
268
- }
106
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Object/defineProperty/detect.js
107
+ var detect = (
108
+ // In IE8, defineProperty could only act on DOM elements, so full support
109
+ // for the feature requires the ability to set a property on an arbitrary object
110
+ 'defineProperty' in Object && (function() {
111
+ try {
112
+ var a = {};
113
+ Object.defineProperty(a, 'test', {value:42});
114
+ return true;
115
+ } catch(e) {
116
+ return false
117
+ }
118
+ }())
119
+ );
269
120
 
270
- })
271
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
121
+ if (detect) return
272
122
 
273
- (function(undefined) {
123
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Object.defineProperty&flags=always
124
+ (function (nativeDefineProperty) {
125
+
126
+ var supportsAccessors = Object.prototype.hasOwnProperty('__defineGetter__');
127
+ var ERR_ACCESSORS_NOT_SUPPORTED = 'Getters & setters cannot be defined on this javascript engine';
128
+ var ERR_VALUE_ACCESSORS = 'A property cannot both have accessors and be writable or have a value';
129
+
130
+ Object.defineProperty = function defineProperty(object, property, descriptor) {
131
+
132
+ // Where native support exists, assume it
133
+ if (nativeDefineProperty && (object === window || object === document || object === Element.prototype || object instanceof Element)) {
134
+ return nativeDefineProperty(object, property, descriptor);
135
+ }
136
+
137
+ if (object === null || !(object instanceof Object || typeof object === 'object')) {
138
+ throw new TypeError('Object.defineProperty called on non-object');
139
+ }
140
+
141
+ if (!(descriptor instanceof Object)) {
142
+ throw new TypeError('Property description must be an object');
143
+ }
144
+
145
+ var propertyString = String(property);
146
+ var hasValueOrWritable = 'value' in descriptor || 'writable' in descriptor;
147
+ var getterType = 'get' in descriptor && typeof descriptor.get;
148
+ var setterType = 'set' in descriptor && typeof descriptor.set;
149
+
150
+ // handle descriptor.get
151
+ if (getterType) {
152
+ if (getterType !== 'function') {
153
+ throw new TypeError('Getter must be a function');
154
+ }
155
+ if (!supportsAccessors) {
156
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
157
+ }
158
+ if (hasValueOrWritable) {
159
+ throw new TypeError(ERR_VALUE_ACCESSORS);
160
+ }
161
+ Object.__defineGetter__.call(object, propertyString, descriptor.get);
162
+ } else {
163
+ object[propertyString] = descriptor.value;
164
+ }
165
+
166
+ // handle descriptor.set
167
+ if (setterType) {
168
+ if (setterType !== 'function') {
169
+ throw new TypeError('Setter must be a function');
170
+ }
171
+ if (!supportsAccessors) {
172
+ throw new TypeError(ERR_ACCESSORS_NOT_SUPPORTED);
173
+ }
174
+ if (hasValueOrWritable) {
175
+ throw new TypeError(ERR_VALUE_ACCESSORS);
176
+ }
177
+ Object.__defineSetter__.call(object, propertyString, descriptor.set);
178
+ }
179
+
180
+ // OK to define value unconditionally - if a getter has been specified as well, an error would be thrown above
181
+ if ('value' in descriptor) {
182
+ object[propertyString] = descriptor.value;
183
+ }
184
+
185
+ return object;
186
+ };
187
+ }(Object.defineProperty));
188
+ })
189
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
190
+
191
+ // @ts-nocheck
192
+ (function (undefined) {
193
+
194
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
195
+ var detect = ("Document" in this);
274
196
 
275
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Document/detect.js
276
- var detect = ("Document" in this);
197
+ if (detect) return
277
198
 
278
- if (detect) return
199
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
200
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
279
201
 
280
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Document&flags=always
281
- if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
202
+ if (this.HTMLDocument) { // IE8
282
203
 
283
- if (this.HTMLDocument) { // IE8
204
+ // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
205
+ this.Document = this.HTMLDocument;
284
206
 
285
- // HTMLDocument is an extension of Document. If the browser has HTMLDocument but not Document, the former will suffice as an alias for the latter.
286
- this.Document = this.HTMLDocument;
207
+ } else {
287
208
 
288
- } else {
209
+ // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
210
+ this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
211
+ this.Document.prototype = document;
212
+ }
213
+ }
214
+
215
+
216
+ })
217
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
218
+
219
+ // @ts-nocheck
220
+
221
+ (function(undefined) {
222
+
223
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
224
+ var detect = ('Element' in this && 'HTMLElement' in this);
225
+
226
+ if (detect) return
227
+
228
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
229
+ (function () {
230
+
231
+ // IE8
232
+ if (window.Element && !window.HTMLElement) {
233
+ window.HTMLElement = window.Element;
234
+ return;
235
+ }
236
+
237
+ // create Element constructor
238
+ window.Element = window.HTMLElement = new Function('return function Element() {}')();
239
+
240
+ // generate sandboxed iframe
241
+ var vbody = document.appendChild(document.createElement('body'));
242
+ var frame = vbody.appendChild(document.createElement('iframe'));
243
+
244
+ // use sandboxed iframe to replicate Element functionality
245
+ var frameDocument = frame.contentWindow.document;
246
+ var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
247
+ var cache = {};
248
+
249
+ // polyfill Element.prototype on an element
250
+ var shiv = function (element, deep) {
251
+ var
252
+ childNodes = element.childNodes || [],
253
+ index = -1,
254
+ key, value, childNode;
255
+
256
+ if (element.nodeType === 1 && element.constructor !== Element) {
257
+ element.constructor = Element;
258
+
259
+ for (key in cache) {
260
+ value = cache[key];
261
+ element[key] = value;
262
+ }
263
+ }
264
+
265
+ while (childNode = deep && childNodes[++index]) {
266
+ shiv(childNode, deep);
267
+ }
268
+
269
+ return element;
270
+ };
271
+
272
+ var elements = document.getElementsByTagName('*');
273
+ var nativeCreateElement = document.createElement;
274
+ var interval;
275
+ var loopLimit = 100;
276
+
277
+ prototype.attachEvent('onpropertychange', function (event) {
278
+ var
279
+ propertyName = event.propertyName,
280
+ nonValue = !cache.hasOwnProperty(propertyName),
281
+ newValue = prototype[propertyName],
282
+ oldValue = cache[propertyName],
283
+ index = -1,
284
+ element;
285
+
286
+ while (element = elements[++index]) {
287
+ if (element.nodeType === 1) {
288
+ if (nonValue || element[propertyName] === oldValue) {
289
+ element[propertyName] = newValue;
290
+ }
291
+ }
292
+ }
293
+
294
+ cache[propertyName] = newValue;
295
+ });
296
+
297
+ prototype.constructor = Element;
298
+
299
+ if (!prototype.hasAttribute) {
300
+ // <Element>.hasAttribute
301
+ prototype.hasAttribute = function hasAttribute(name) {
302
+ return this.getAttribute(name) !== null;
303
+ };
304
+ }
289
305
 
290
- // Create an empty function to act as the missing constructor for the document object, attach the document object as its prototype. The function needs to be anonymous else it is hoisted and causes the feature detect to prematurely pass, preventing the assignments below being made.
291
- this.Document = this.HTMLDocument = document.constructor = (new Function('return function Document() {}')());
292
- this.Document.prototype = document;
293
- }
294
- }
295
-
296
-
297
- })
298
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
299
-
300
- (function(undefined) {
301
-
302
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Element/detect.js
303
- var detect = ('Element' in this && 'HTMLElement' in this);
304
-
305
- if (detect) return
306
-
307
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Element&flags=always
308
- (function () {
309
-
310
- // IE8
311
- if (window.Element && !window.HTMLElement) {
312
- window.HTMLElement = window.Element;
313
- return;
314
- }
315
-
316
- // create Element constructor
317
- window.Element = window.HTMLElement = new Function('return function Element() {}')();
318
-
319
- // generate sandboxed iframe
320
- var vbody = document.appendChild(document.createElement('body'));
321
- var frame = vbody.appendChild(document.createElement('iframe'));
322
-
323
- // use sandboxed iframe to replicate Element functionality
324
- var frameDocument = frame.contentWindow.document;
325
- var prototype = Element.prototype = frameDocument.appendChild(frameDocument.createElement('*'));
326
- var cache = {};
327
-
328
- // polyfill Element.prototype on an element
329
- var shiv = function (element, deep) {
330
- var
331
- childNodes = element.childNodes || [],
332
- index = -1,
333
- key, value, childNode;
334
-
335
- if (element.nodeType === 1 && element.constructor !== Element) {
336
- element.constructor = Element;
337
-
338
- for (key in cache) {
339
- value = cache[key];
340
- element[key] = value;
341
- }
342
- }
343
-
344
- while (childNode = deep && childNodes[++index]) {
345
- shiv(childNode, deep);
346
- }
347
-
348
- return element;
349
- };
350
-
351
- var elements = document.getElementsByTagName('*');
352
- var nativeCreateElement = document.createElement;
353
- var interval;
354
- var loopLimit = 100;
355
-
356
- prototype.attachEvent('onpropertychange', function (event) {
357
- var
358
- propertyName = event.propertyName,
359
- nonValue = !cache.hasOwnProperty(propertyName),
360
- newValue = prototype[propertyName],
361
- oldValue = cache[propertyName],
362
- index = -1,
363
- element;
364
-
365
- while (element = elements[++index]) {
366
- if (element.nodeType === 1) {
367
- if (nonValue || element[propertyName] === oldValue) {
368
- element[propertyName] = newValue;
369
- }
370
- }
371
- }
372
-
373
- cache[propertyName] = newValue;
374
- });
375
-
376
- prototype.constructor = Element;
377
-
378
- if (!prototype.hasAttribute) {
379
- // <Element>.hasAttribute
380
- prototype.hasAttribute = function hasAttribute(name) {
381
- return this.getAttribute(name) !== null;
382
- };
383
- }
384
-
385
- // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
386
- function bodyCheck() {
387
- if (!(loopLimit--)) clearTimeout(interval);
388
- if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
389
- shiv(document, true);
390
- if (interval && document.body.prototype) clearTimeout(interval);
391
- return (!!document.body.prototype);
392
- }
393
- return false;
394
- }
395
- if (!bodyCheck()) {
396
- document.onreadystatechange = bodyCheck;
397
- interval = setInterval(bodyCheck, 25);
398
- }
399
-
400
- // Apply to any new elements created after load
401
- document.createElement = function createElement(nodeName) {
402
- var element = nativeCreateElement(String(nodeName).toLowerCase());
403
- return shiv(element);
404
- };
405
-
406
- // remove sandboxed iframe
407
- document.removeChild(vbody);
408
- }());
409
-
410
- })
411
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
412
-
413
- (function(undefined) {
414
-
415
- // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
416
- var detect = (
417
- (function(global) {
418
-
419
- if (!('Event' in global)) return false;
420
- if (typeof global.Event === 'function') return true;
421
-
422
- try {
423
-
424
- // In IE 9-11, the Event object exists but cannot be instantiated
425
- new Event('click');
426
- return true;
427
- } catch(e) {
306
+ // Apply Element prototype to the pre-existing DOM as soon as the body element appears.
307
+ function bodyCheck() {
308
+ if (!(loopLimit--)) clearTimeout(interval);
309
+ if (document.body && !document.body.prototype && /(complete|interactive)/.test(document.readyState)) {
310
+ shiv(document, true);
311
+ if (interval && document.body.prototype) clearTimeout(interval);
312
+ return (!!document.body.prototype);
313
+ }
428
314
  return false;
429
315
  }
430
- }(this))
431
- );
432
-
433
- if (detect) return
434
-
435
- // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
436
- (function () {
437
- var unlistenableWindowEvents = {
438
- click: 1,
439
- dblclick: 1,
440
- keyup: 1,
441
- keypress: 1,
442
- keydown: 1,
443
- mousedown: 1,
444
- mouseup: 1,
445
- mousemove: 1,
446
- mouseover: 1,
447
- mouseenter: 1,
448
- mouseleave: 1,
449
- mouseout: 1,
450
- storage: 1,
451
- storagecommit: 1,
452
- textinput: 1
453
- };
454
-
455
- // This polyfill depends on availability of `document` so will not run in a worker
456
- // However, we asssume there are no browsers with worker support that lack proper
457
- // support for `Event` within the worker
458
- if (typeof document === 'undefined' || typeof window === 'undefined') return;
459
-
460
- function indexOf(array, element) {
461
- var
462
- index = -1,
463
- length = array.length;
464
-
465
- while (++index < length) {
466
- if (index in array && array[index] === element) {
467
- return index;
468
- }
469
- }
470
-
471
- return -1;
472
- }
473
-
474
- var existingProto = (window.Event && window.Event.prototype) || null;
475
- window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
476
- if (!type) {
477
- throw new Error('Not enough arguments');
478
- }
479
-
480
- var event;
481
- // Shortcut if browser supports createEvent
482
- if ('createEvent' in document) {
483
- event = document.createEvent('Event');
484
- var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
485
- var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
486
-
487
- event.initEvent(type, bubbles, cancelable);
488
-
489
- return event;
490
- }
491
-
492
- event = document.createEventObject();
493
-
494
- event.type = type;
495
- event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
496
- event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
497
-
498
- return event;
499
- };
500
- if (existingProto) {
501
- Object.defineProperty(window.Event, 'prototype', {
502
- configurable: false,
503
- enumerable: false,
504
- writable: true,
505
- value: existingProto
506
- });
507
- }
508
-
509
- if (!('createEvent' in document)) {
510
- window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
511
- var
512
- element = this,
513
- type = arguments[0],
514
- listener = arguments[1];
515
-
516
- if (element === window && type in unlistenableWindowEvents) {
517
- throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
518
- }
519
-
520
- if (!element._events) {
521
- element._events = {};
522
- }
523
-
524
- if (!element._events[type]) {
525
- element._events[type] = function (event) {
526
- var
527
- list = element._events[event.type].list,
528
- events = list.slice(),
529
- index = -1,
530
- length = events.length,
531
- eventElement;
532
-
533
- event.preventDefault = function preventDefault() {
534
- if (event.cancelable !== false) {
535
- event.returnValue = false;
536
- }
537
- };
538
-
539
- event.stopPropagation = function stopPropagation() {
540
- event.cancelBubble = true;
541
- };
542
-
543
- event.stopImmediatePropagation = function stopImmediatePropagation() {
544
- event.cancelBubble = true;
545
- event.cancelImmediate = true;
546
- };
547
-
548
- event.currentTarget = element;
549
- event.relatedTarget = event.fromElement || null;
550
- event.target = event.target || event.srcElement || element;
551
- event.timeStamp = new Date().getTime();
552
-
553
- if (event.clientX) {
554
- event.pageX = event.clientX + document.documentElement.scrollLeft;
555
- event.pageY = event.clientY + document.documentElement.scrollTop;
556
- }
557
-
558
- while (++index < length && !event.cancelImmediate) {
559
- if (index in events) {
560
- eventElement = events[index];
561
-
562
- if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
563
- eventElement.call(element, event);
564
- }
565
- }
566
- }
567
- };
568
-
569
- element._events[type].list = [];
570
-
571
- if (element.attachEvent) {
572
- element.attachEvent('on' + type, element._events[type]);
573
- }
574
- }
575
-
576
- element._events[type].list.push(listener);
577
- };
578
-
579
- window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
580
- var
581
- element = this,
582
- type = arguments[0],
583
- listener = arguments[1],
584
- index;
585
-
586
- if (element._events && element._events[type] && element._events[type].list) {
587
- index = indexOf(element._events[type].list, listener);
588
-
589
- if (index !== -1) {
590
- element._events[type].list.splice(index, 1);
591
-
592
- if (!element._events[type].list.length) {
593
- if (element.detachEvent) {
594
- element.detachEvent('on' + type, element._events[type]);
595
- }
596
- delete element._events[type];
597
- }
598
- }
599
- }
600
- };
601
-
602
- window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
603
- if (!arguments.length) {
604
- throw new Error('Not enough arguments');
605
- }
606
-
607
- if (!event || typeof event.type !== 'string') {
608
- throw new Error('DOM Events Exception 0');
609
- }
610
-
611
- var element = this, type = event.type;
612
-
613
- try {
614
- if (!event.bubbles) {
615
- event.cancelBubble = true;
616
-
617
- var cancelBubbleEvent = function (event) {
618
- event.cancelBubble = true;
619
-
620
- (element || window).detachEvent('on' + type, cancelBubbleEvent);
621
- };
622
-
623
- this.attachEvent('on' + type, cancelBubbleEvent);
624
- }
625
-
626
- this.fireEvent('on' + type, event);
627
- } catch (error) {
628
- event.target = element;
629
-
630
- do {
631
- event.currentTarget = element;
632
-
633
- if ('_events' in element && typeof element._events[type] === 'function') {
634
- element._events[type].call(element, event);
635
- }
636
-
637
- if (typeof element['on' + type] === 'function') {
638
- element['on' + type].call(element, event);
639
- }
640
-
641
- element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
642
- } while (element && !event.cancelBubble);
643
- }
644
-
645
- return true;
646
- };
647
-
648
- // Add the DOMContentLoaded Event
649
- document.attachEvent('onreadystatechange', function() {
650
- if (document.readyState === 'complete') {
651
- document.dispatchEvent(new Event('DOMContentLoaded', {
652
- bubbles: true
653
- }));
654
- }
655
- });
656
- }
657
- }());
658
-
659
- })
660
- .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
661
-
662
- (function(undefined) {
663
-
664
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/detect.js
665
- var detect = (
666
- 'document' in this && "matches" in document.documentElement
667
- );
316
+ if (!bodyCheck()) {
317
+ document.onreadystatechange = bodyCheck;
318
+ interval = setInterval(bodyCheck, 25);
319
+ }
668
320
 
669
- if (detect) return
321
+ // Apply to any new elements created after load
322
+ document.createElement = function createElement(nodeName) {
323
+ var element = nativeCreateElement(String(nodeName).toLowerCase());
324
+ return shiv(element);
325
+ };
670
326
 
671
- // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/polyfill.js
672
- Element.prototype.matches = Element.prototype.webkitMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.mozMatchesSelector || function matches(selector) {
673
- var element = this;
674
- var elements = (element.document || element.ownerDocument).querySelectorAll(selector);
675
- var index = 0;
327
+ // remove sandboxed iframe
328
+ document.removeChild(vbody);
329
+ }());
676
330
 
677
- while (elements[index] && elements[index] !== element) {
678
- ++index;
679
- }
331
+ })
332
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
680
333
 
681
- return !!elements[index];
682
- };
334
+ // @ts-nocheck
683
335
 
684
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
336
+ (function(undefined) {
685
337
 
686
- (function(undefined) {
338
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
339
+ var detect = (function(){
340
+ if (!document.documentElement.dataset) {
341
+ return false;
342
+ }
343
+ var el = document.createElement('div');
344
+ el.setAttribute("data-a-b", "c");
345
+ return el.dataset && el.dataset.aB == "c";
346
+ }());
687
347
 
688
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/detect.js
689
- var detect = (
690
- 'document' in this && "closest" in document.documentElement
691
- );
348
+ if (detect) return
692
349
 
693
- if (detect) return
350
+ // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
351
+ Object.defineProperty(Element.prototype, 'dataset', {
352
+ get: function() {
353
+ var element = this;
354
+ var attributes = this.attributes;
355
+ var map = {};
356
+
357
+ for (var i = 0; i < attributes.length; i++) {
358
+ var attribute = attributes[i];
359
+
360
+ // This regex has been edited from the original polyfill, to add
361
+ // support for period (.) separators in data-* attribute names. These
362
+ // are allowed in the HTML spec, but were not covered by the original
363
+ // polyfill's regex. We use periods in our i18n implementation.
364
+ if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
365
+ var name = attribute.name;
366
+ var value = attribute.value;
367
+
368
+ var propName = name.substr(5).replace(/-./g, function (prop) {
369
+ return prop.charAt(1).toUpperCase();
370
+ });
371
+
372
+ // If this browser supports __defineGetter__ and __defineSetter__,
373
+ // continue using defineProperty. If not (like IE 8 and below), we use
374
+ // a hacky fallback which at least gives an object in the right format
375
+ if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
376
+ Object.defineProperty(map, propName, {
377
+ enumerable: true,
378
+ get: function() {
379
+ return this.value;
380
+ }.bind({value: value || ''}),
381
+ set: function setter(name, value) {
382
+ if (typeof value !== 'undefined') {
383
+ this.setAttribute(name, value);
384
+ } else {
385
+ this.removeAttribute(name);
386
+ }
387
+ }.bind(element, name)
388
+ });
389
+ } else {
390
+ map[propName] = value;
391
+ }
392
+
393
+ }
394
+ }
395
+
396
+ return map;
397
+ }
398
+ });
399
+
400
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
401
+
402
+ // @ts-nocheck
403
+ (function (undefined) {
404
+
405
+ // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
406
+ var detect = ('trim' in String.prototype);
407
+
408
+ if (detect) return
409
+
410
+ // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
411
+ String.prototype.trim = function () {
412
+ return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
413
+ };
414
+
415
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
694
416
 
695
- // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/polyfill.js
696
- Element.prototype.closest = function closest(selector) {
697
- var node = this;
417
+ /* eslint-disable es-x/no-string-prototype-trim -- Polyfill imported */
698
418
 
699
- while (node) {
700
- if (node.matches(selector)) return node;
701
- else node = 'SVGElement' in window && node instanceof SVGElement ? node.parentNode : node.parentElement;
419
+ /**
420
+ * Normalise string
421
+ *
422
+ * 'If it looks like a duck, and it quacks like a duck…' 🦆
423
+ *
424
+ * If the passed value looks like a boolean or a number, convert it to a boolean
425
+ * or number.
426
+ *
427
+ * Designed to be used to convert config passed via data attributes (which are
428
+ * always strings) into something sensible.
429
+ *
430
+ * @deprecated Will be made private in v5.0
431
+ * @param {string} value - The value to normalise
432
+ * @returns {string | boolean | number | undefined} Normalised data
433
+ */
434
+ function normaliseString (value) {
435
+ if (typeof value !== 'string') {
436
+ return value
702
437
  }
703
438
 
704
- return null;
705
- };
439
+ var trimmedValue = value.trim();
440
+
441
+ if (trimmedValue === 'true') {
442
+ return true
443
+ }
444
+
445
+ if (trimmedValue === 'false') {
446
+ return false
447
+ }
448
+
449
+ // Empty / whitespace-only strings are considered finite so we need to check
450
+ // the length of the trimmed string as well
451
+ if (trimmedValue.length > 0 && isFinite(Number(trimmedValue))) {
452
+ return Number(trimmedValue)
453
+ }
454
+
455
+ return value
456
+ }
706
457
 
707
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
708
-
709
- /**
710
- * Common helpers which do not require polyfill.
711
- *
712
- * IMPORTANT: If a helper require a polyfill, please isolate it in its own module
713
- * so that the polyfill can be properly tree-shaken and does not burden
714
- * the components that do not need that helper
715
- *
716
- * @module common/index
717
- */
718
-
719
- /**
720
- * Config flattening function
721
- *
722
- * Takes any number of objects, flattens them into namespaced key-value pairs,
723
- * (e.g. {'i18n.showSection': 'Show section'}) and combines them together, with
724
- * greatest priority on the LAST item passed in.
725
- *
726
- * @returns {object} A flattened object of key-value pairs.
727
- */
728
- function mergeConfigs (/* configObject1, configObject2, ...configObjects */) {
729
458
  /**
730
- * Function to take nested objects and flatten them to a dot-separated keyed
731
- * object. Doing this means we don't need to do any deep/recursive merging of
732
- * each of our objects, nor transform our dataset from a flat list into a
733
- * nested object.
459
+ * Normalise dataset
460
+ *
461
+ * Loop over an object and normalise each value using normaliseData function
734
462
  *
735
- * @param {object} configObject - Deeply nested object
736
- * @returns {object} Flattened object with dot-separated keys
463
+ * @deprecated Will be made private in v5.0
464
+ * @param {DOMStringMap} dataset - HTML element dataset
465
+ * @returns {Object<string, unknown>} Normalised dataset
737
466
  */
738
- var flattenObject = function (configObject) {
739
- // Prepare an empty return object
740
- var flattenedObject = {};
741
-
742
- // Our flattening function, this is called recursively for each level of
743
- // depth in the object. At each level we prepend the previous level names to
744
- // the key using `prefix`.
745
- var flattenLoop = function (obj, prefix) {
746
- // Loop through keys...
747
- for (var key in obj) {
748
- // Check to see if this is a prototypical key/value,
749
- // if it is, skip it.
750
- if (!Object.prototype.hasOwnProperty.call(obj, key)) {
751
- continue
752
- }
753
- var value = obj[key];
754
- var prefixedKey = prefix ? prefix + '.' + key : key;
755
- if (typeof value === 'object') {
756
- // If the value is a nested object, recurse over that too
757
- flattenLoop(value, prefixedKey);
758
- } else {
759
- // Otherwise, add this value to our return object
760
- flattenedObject[prefixedKey] = value;
761
- }
467
+ function normaliseDataset (dataset) {
468
+ /** @type {Object<string, unknown>} */
469
+ var out = {};
470
+
471
+ for (var key in dataset) {
472
+ out[key] = normaliseString(dataset[key]);
473
+ }
474
+
475
+ return out
476
+ }
477
+
478
+ // @ts-nocheck
479
+ (function (undefined) {
480
+
481
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/detect.js
482
+ var detect = (
483
+ 'document' in this && "matches" in document.documentElement
484
+ );
485
+
486
+ if (detect) return
487
+
488
+ // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/matches/polyfill.js
489
+ Element.prototype.matches = Element.prototype.webkitMatchesSelector || Element.prototype.oMatchesSelector || Element.prototype.msMatchesSelector || Element.prototype.mozMatchesSelector || function matches(selector) {
490
+ var element = this;
491
+ var elements = (element.document || element.ownerDocument).querySelectorAll(selector);
492
+ var index = 0;
493
+
494
+ while (elements[index] && elements[index] !== element) {
495
+ ++index;
762
496
  }
497
+
498
+ return !!elements[index];
763
499
  };
764
500
 
765
- // Kick off the recursive loop
766
- flattenLoop(configObject);
767
- return flattenedObject
768
- };
501
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
502
+
503
+ // @ts-nocheck
504
+
505
+ (function(undefined) {
506
+
507
+ // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/detect.js
508
+ var detect = (
509
+ 'document' in this && "closest" in document.documentElement
510
+ );
511
+
512
+ if (detect) return
513
+
514
+ // Polyfill from https://raw.githubusercontent.com/Financial-Times/polyfill-service/1f3c09b402f65bf6e393f933a15ba63f1b86ef1f/packages/polyfill-library/polyfills/Element/prototype/closest/polyfill.js
515
+ Element.prototype.closest = function closest(selector) {
516
+ var node = this;
769
517
 
770
- // Start with an empty object as our base
771
- var formattedConfigObject = {};
772
-
773
- // Loop through each of the remaining passed objects and push their keys
774
- // one-by-one into configObject. Any duplicate keys will override the existing
775
- // key with the new value.
776
- for (var i = 0; i < arguments.length; i++) {
777
- var obj = flattenObject(arguments[i]);
778
- for (var key in obj) {
779
- if (Object.prototype.hasOwnProperty.call(obj, key)) {
780
- formattedConfigObject[key] = obj[key];
518
+ while (node) {
519
+ if (node.matches(selector)) return node;
520
+ else node = 'SVGElement' in window && node instanceof SVGElement ? node.parentNode : node.parentElement;
781
521
  }
782
- }
522
+
523
+ return null;
524
+ };
525
+
526
+ }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
527
+
528
+ // @ts-nocheck
529
+ (function (undefined) {
530
+
531
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Window/detect.js
532
+ var detect = ('Window' in this);
533
+
534
+ if (detect) return
535
+
536
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Window&flags=always
537
+ if ((typeof WorkerGlobalScope === "undefined") && (typeof importScripts !== "function")) {
538
+ (function (global) {
539
+ if (global.constructor) {
540
+ global.Window = global.constructor;
541
+ } else {
542
+ (global.Window = global.constructor = new Function('return function Window() {}')()).prototype = this;
543
+ }
544
+ }(this));
783
545
  }
784
546
 
785
- return formattedConfigObject
786
- }
547
+ })
548
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
787
549
 
788
- /**
789
- * @callback nodeListIterator
790
- * @param {Element} value - The current node being iterated on
791
- * @param {number} index - The current index in the iteration
792
- * @param {NodeListOf<Element>} nodes - NodeList from querySelectorAll()
793
- * @returns {undefined}
794
- */
550
+ // @ts-nocheck
795
551
 
796
- (function(undefined) {
552
+ (function(undefined) {
797
553
 
798
- // Detection from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/detect.js
799
- var detect = (function(){
800
- if (!document.documentElement.dataset) {
801
- return false;
802
- }
803
- var el = document.createElement('div');
804
- el.setAttribute("data-a-b", "c");
805
- return el.dataset && el.dataset.aB == "c";
806
- }());
554
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Event/detect.js
555
+ var detect = (
556
+ (function(global) {
557
+
558
+ if (!('Event' in global)) return false;
559
+ if (typeof global.Event === 'function') return true;
560
+
561
+ try {
562
+
563
+ // In IE 9-11, the Event object exists but cannot be instantiated
564
+ new Event('click');
565
+ return true;
566
+ } catch(e) {
567
+ return false;
568
+ }
569
+ }(this))
570
+ );
807
571
 
808
572
  if (detect) return
809
573
 
810
- // Polyfill derived from https://raw.githubusercontent.com/Financial-Times/polyfill-library/13cf7c340974d128d557580b5e2dafcd1b1192d1/polyfills/Element/prototype/dataset/polyfill.js
811
- Object.defineProperty(Element.prototype, 'dataset', {
812
- get: function() {
813
- var element = this;
814
- var attributes = this.attributes;
815
- var map = {};
816
-
817
- for (var i = 0; i < attributes.length; i++) {
818
- var attribute = attributes[i];
819
-
820
- // This regex has been edited from the original polyfill, to add
821
- // support for period (.) separators in data-* attribute names. These
822
- // are allowed in the HTML spec, but were not covered by the original
823
- // polyfill's regex. We use periods in our i18n implementation.
824
- if (attribute && attribute.name && (/^data-\w[.\w-]*$/).test(attribute.name)) {
825
- var name = attribute.name;
826
- var value = attribute.value;
827
-
828
- var propName = name.substr(5).replace(/-./g, function (prop) {
829
- return prop.charAt(1).toUpperCase();
830
- });
831
-
832
- // If this browser supports __defineGetter__ and __defineSetter__,
833
- // continue using defineProperty. If not (like IE 8 and below), we use
834
- // a hacky fallback which at least gives an object in the right format
835
- if ('__defineGetter__' in Object.prototype && '__defineSetter__' in Object.prototype) {
836
- Object.defineProperty(map, propName, {
837
- enumerable: true,
838
- get: function() {
839
- return this.value;
840
- }.bind({value: value || ''}),
841
- set: function setter(name, value) {
842
- if (typeof value !== 'undefined') {
843
- this.setAttribute(name, value);
574
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Event&flags=always
575
+ (function () {
576
+ var unlistenableWindowEvents = {
577
+ click: 1,
578
+ dblclick: 1,
579
+ keyup: 1,
580
+ keypress: 1,
581
+ keydown: 1,
582
+ mousedown: 1,
583
+ mouseup: 1,
584
+ mousemove: 1,
585
+ mouseover: 1,
586
+ mouseenter: 1,
587
+ mouseleave: 1,
588
+ mouseout: 1,
589
+ storage: 1,
590
+ storagecommit: 1,
591
+ textinput: 1
592
+ };
593
+
594
+ // This polyfill depends on availability of `document` so will not run in a worker
595
+ // However, we asssume there are no browsers with worker support that lack proper
596
+ // support for `Event` within the worker
597
+ if (typeof document === 'undefined' || typeof window === 'undefined') return;
598
+
599
+ function indexOf(array, element) {
600
+ var
601
+ index = -1,
602
+ length = array.length;
603
+
604
+ while (++index < length) {
605
+ if (index in array && array[index] === element) {
606
+ return index;
607
+ }
608
+ }
609
+
610
+ return -1;
611
+ }
612
+
613
+ var existingProto = (window.Event && window.Event.prototype) || null;
614
+ window.Event = Window.prototype.Event = function Event(type, eventInitDict) {
615
+ if (!type) {
616
+ throw new Error('Not enough arguments');
617
+ }
618
+
619
+ var event;
620
+ // Shortcut if browser supports createEvent
621
+ if ('createEvent' in document) {
622
+ event = document.createEvent('Event');
623
+ var bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
624
+ var cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
625
+
626
+ event.initEvent(type, bubbles, cancelable);
627
+
628
+ return event;
629
+ }
630
+
631
+ event = document.createEventObject();
632
+
633
+ event.type = type;
634
+ event.bubbles = eventInitDict && eventInitDict.bubbles !== undefined ? eventInitDict.bubbles : false;
635
+ event.cancelable = eventInitDict && eventInitDict.cancelable !== undefined ? eventInitDict.cancelable : false;
636
+
637
+ return event;
638
+ };
639
+ if (existingProto) {
640
+ Object.defineProperty(window.Event, 'prototype', {
641
+ configurable: false,
642
+ enumerable: false,
643
+ writable: true,
644
+ value: existingProto
645
+ });
646
+ }
647
+
648
+ if (!('createEvent' in document)) {
649
+ window.addEventListener = Window.prototype.addEventListener = Document.prototype.addEventListener = Element.prototype.addEventListener = function addEventListener() {
650
+ var
651
+ element = this,
652
+ type = arguments[0],
653
+ listener = arguments[1];
654
+
655
+ if (element === window && type in unlistenableWindowEvents) {
656
+ throw new Error('In IE8 the event: ' + type + ' is not available on the window object. Please see https://github.com/Financial-Times/polyfill-service/issues/317 for more information.');
657
+ }
658
+
659
+ if (!element._events) {
660
+ element._events = {};
661
+ }
662
+
663
+ if (!element._events[type]) {
664
+ element._events[type] = function (event) {
665
+ var
666
+ list = element._events[event.type].list,
667
+ events = list.slice(),
668
+ index = -1,
669
+ length = events.length,
670
+ eventElement;
671
+
672
+ event.preventDefault = function preventDefault() {
673
+ if (event.cancelable !== false) {
674
+ event.returnValue = false;
675
+ }
676
+ };
677
+
678
+ event.stopPropagation = function stopPropagation() {
679
+ event.cancelBubble = true;
680
+ };
681
+
682
+ event.stopImmediatePropagation = function stopImmediatePropagation() {
683
+ event.cancelBubble = true;
684
+ event.cancelImmediate = true;
685
+ };
686
+
687
+ event.currentTarget = element;
688
+ event.relatedTarget = event.fromElement || null;
689
+ event.target = event.target || event.srcElement || element;
690
+ event.timeStamp = new Date().getTime();
691
+
692
+ if (event.clientX) {
693
+ event.pageX = event.clientX + document.documentElement.scrollLeft;
694
+ event.pageY = event.clientY + document.documentElement.scrollTop;
695
+ }
696
+
697
+ while (++index < length && !event.cancelImmediate) {
698
+ if (index in events) {
699
+ eventElement = events[index];
700
+
701
+ if (indexOf(list, eventElement) !== -1 && typeof eventElement === 'function') {
702
+ eventElement.call(element, event);
703
+ }
704
+ }
705
+ }
706
+ };
707
+
708
+ element._events[type].list = [];
709
+
710
+ if (element.attachEvent) {
711
+ element.attachEvent('on' + type, element._events[type]);
712
+ }
713
+ }
714
+
715
+ element._events[type].list.push(listener);
716
+ };
717
+
718
+ window.removeEventListener = Window.prototype.removeEventListener = Document.prototype.removeEventListener = Element.prototype.removeEventListener = function removeEventListener() {
719
+ var
720
+ element = this,
721
+ type = arguments[0],
722
+ listener = arguments[1],
723
+ index;
724
+
725
+ if (element._events && element._events[type] && element._events[type].list) {
726
+ index = indexOf(element._events[type].list, listener);
727
+
728
+ if (index !== -1) {
729
+ element._events[type].list.splice(index, 1);
730
+
731
+ if (!element._events[type].list.length) {
732
+ if (element.detachEvent) {
733
+ element.detachEvent('on' + type, element._events[type]);
734
+ }
735
+ delete element._events[type];
736
+ }
737
+ }
738
+ }
739
+ };
740
+
741
+ window.dispatchEvent = Window.prototype.dispatchEvent = Document.prototype.dispatchEvent = Element.prototype.dispatchEvent = function dispatchEvent(event) {
742
+ if (!arguments.length) {
743
+ throw new Error('Not enough arguments');
744
+ }
745
+
746
+ if (!event || typeof event.type !== 'string') {
747
+ throw new Error('DOM Events Exception 0');
748
+ }
749
+
750
+ var element = this, type = event.type;
751
+
752
+ try {
753
+ if (!event.bubbles) {
754
+ event.cancelBubble = true;
755
+
756
+ var cancelBubbleEvent = function (event) {
757
+ event.cancelBubble = true;
758
+
759
+ (element || window).detachEvent('on' + type, cancelBubbleEvent);
760
+ };
761
+
762
+ this.attachEvent('on' + type, cancelBubbleEvent);
763
+ }
764
+
765
+ this.fireEvent('on' + type, event);
766
+ } catch (error) {
767
+ event.target = element;
768
+
769
+ do {
770
+ event.currentTarget = element;
771
+
772
+ if ('_events' in element && typeof element._events[type] === 'function') {
773
+ element._events[type].call(element, event);
774
+ }
775
+
776
+ if (typeof element['on' + type] === 'function') {
777
+ element['on' + type].call(element, event);
778
+ }
779
+
780
+ element = element.nodeType === 9 ? element.parentWindow : element.parentNode;
781
+ } while (element && !event.cancelBubble);
782
+ }
783
+
784
+ return true;
785
+ };
786
+
787
+ // Add the DOMContentLoaded Event
788
+ document.attachEvent('onreadystatechange', function() {
789
+ if (document.readyState === 'complete') {
790
+ document.dispatchEvent(new Event('DOMContentLoaded', {
791
+ bubbles: true
792
+ }));
793
+ }
794
+ });
795
+ }
796
+ }());
797
+
798
+ })
799
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
800
+
801
+ // @ts-nocheck
802
+
803
+ (function(undefined) {
804
+ // Detection from https://github.com/Financial-Times/polyfill-service/blob/master/packages/polyfill-library/polyfills/Function/prototype/bind/detect.js
805
+ var detect = 'bind' in Function.prototype;
806
+
807
+ if (detect) return
808
+
809
+ // Polyfill from https://cdn.polyfill.io/v2/polyfill.js?features=Function.prototype.bind&flags=always
810
+ Object.defineProperty(Function.prototype, 'bind', {
811
+ value: function bind(that) { // .length is 1
812
+ // add necessary es5-shim utilities
813
+ var $Array = Array;
814
+ var $Object = Object;
815
+ var ObjectPrototype = $Object.prototype;
816
+ var ArrayPrototype = $Array.prototype;
817
+ var Empty = function Empty() {};
818
+ var to_string = ObjectPrototype.toString;
819
+ var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';
820
+ var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, tryFunctionObject = function tryFunctionObject(value) { try { fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]'; isCallable = function isCallable(value) { if (typeof value !== 'function') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };
821
+ var array_slice = ArrayPrototype.slice;
822
+ var array_concat = ArrayPrototype.concat;
823
+ var array_push = ArrayPrototype.push;
824
+ var max = Math.max;
825
+ // /add necessary es5-shim utilities
826
+
827
+ // 1. Let Target be the this value.
828
+ var target = this;
829
+ // 2. If IsCallable(Target) is false, throw a TypeError exception.
830
+ if (!isCallable(target)) {
831
+ throw new TypeError('Function.prototype.bind called on incompatible ' + target);
832
+ }
833
+ // 3. Let A be a new (possibly empty) internal list of all of the
834
+ // argument values provided after thisArg (arg1, arg2 etc), in order.
835
+ // XXX slicedArgs will stand in for "A" if used
836
+ var args = array_slice.call(arguments, 1); // for normal call
837
+ // 4. Let F be a new native ECMAScript object.
838
+ // 11. Set the [[Prototype]] internal property of F to the standard
839
+ // built-in Function prototype object as specified in 15.3.3.1.
840
+ // 12. Set the [[Call]] internal property of F as described in
841
+ // 15.3.4.5.1.
842
+ // 13. Set the [[Construct]] internal property of F as described in
843
+ // 15.3.4.5.2.
844
+ // 14. Set the [[HasInstance]] internal property of F as described in
845
+ // 15.3.4.5.3.
846
+ var bound;
847
+ var binder = function () {
848
+
849
+ if (this instanceof bound) {
850
+ // 15.3.4.5.2 [[Construct]]
851
+ // When the [[Construct]] internal method of a function object,
852
+ // F that was created using the bind function is called with a
853
+ // list of arguments ExtraArgs, the following steps are taken:
854
+ // 1. Let target be the value of F's [[TargetFunction]]
855
+ // internal property.
856
+ // 2. If target has no [[Construct]] internal method, a
857
+ // TypeError exception is thrown.
858
+ // 3. Let boundArgs be the value of F's [[BoundArgs]] internal
859
+ // property.
860
+ // 4. Let args be a new list containing the same values as the
861
+ // list boundArgs in the same order followed by the same
862
+ // values as the list ExtraArgs in the same order.
863
+ // 5. Return the result of calling the [[Construct]] internal
864
+ // method of target providing args as the arguments.
865
+
866
+ var result = target.apply(
867
+ this,
868
+ array_concat.call(args, array_slice.call(arguments))
869
+ );
870
+ if ($Object(result) === result) {
871
+ return result;
872
+ }
873
+ return this;
874
+
844
875
  } else {
845
- this.removeAttribute(name);
876
+ // 15.3.4.5.1 [[Call]]
877
+ // When the [[Call]] internal method of a function object, F,
878
+ // which was created using the bind function is called with a
879
+ // this value and a list of arguments ExtraArgs, the following
880
+ // steps are taken:
881
+ // 1. Let boundArgs be the value of F's [[BoundArgs]] internal
882
+ // property.
883
+ // 2. Let boundThis be the value of F's [[BoundThis]] internal
884
+ // property.
885
+ // 3. Let target be the value of F's [[TargetFunction]] internal
886
+ // property.
887
+ // 4. Let args be a new list containing the same values as the
888
+ // list boundArgs in the same order followed by the same
889
+ // values as the list ExtraArgs in the same order.
890
+ // 5. Return the result of calling the [[Call]] internal method
891
+ // of target providing boundThis as the this value and
892
+ // providing args as the arguments.
893
+
894
+ // equiv: target.call(this, ...boundArgs, ...args)
895
+ return target.apply(
896
+ that,
897
+ array_concat.call(args, array_slice.call(arguments))
898
+ );
899
+
846
900
  }
847
- }.bind(element, name)
848
- });
849
- } else {
850
- map[propName] = value;
851
- }
852
901
 
902
+ };
903
+
904
+ // 15. If the [[Class]] internal property of Target is "Function", then
905
+ // a. Let L be the length property of Target minus the length of A.
906
+ // b. Set the length own property of F to either 0 or L, whichever is
907
+ // larger.
908
+ // 16. Else set the length own property of F to 0.
909
+
910
+ var boundLength = max(0, target.length - args.length);
911
+
912
+ // 17. Set the attributes of the length own property of F to the values
913
+ // specified in 15.3.5.1.
914
+ var boundArgs = [];
915
+ for (var i = 0; i < boundLength; i++) {
916
+ array_push.call(boundArgs, '$' + i);
917
+ }
918
+
919
+ // XXX Build a dynamic function with desired amount of arguments is the only
920
+ // way to set the length property of a function.
921
+ // In environments where Content Security Policies enabled (Chrome extensions,
922
+ // for ex.) all use of eval or Function costructor throws an exception.
923
+ // However in all of these environments Function.prototype.bind exists
924
+ // and so this code will never be executed.
925
+ bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this, arguments); }')(binder);
926
+
927
+ if (target.prototype) {
928
+ Empty.prototype = target.prototype;
929
+ bound.prototype = new Empty();
930
+ // Clean up dangling references.
931
+ Empty.prototype = null;
932
+ }
933
+
934
+ // TODO
935
+ // 18. Set the [[Extensible]] internal property of F to true.
936
+
937
+ // TODO
938
+ // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).
939
+ // 20. Call the [[DefineOwnProperty]] internal method of F with
940
+ // arguments "caller", PropertyDescriptor {[[Get]]: thrower, [[Set]]:
941
+ // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and
942
+ // false.
943
+ // 21. Call the [[DefineOwnProperty]] internal method of F with
944
+ // arguments "arguments", PropertyDescriptor {[[Get]]: thrower,
945
+ // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},
946
+ // and false.
947
+
948
+ // TODO
949
+ // NOTE Function objects created using Function.prototype.bind do not
950
+ // have a prototype property or the [[Code]], [[FormalParameters]], and
951
+ // [[Scope]] internal properties.
952
+ // XXX can't delete prototype in pure-js.
953
+
954
+ // 22. Return F.
955
+ return bound;
853
956
  }
854
- }
855
-
856
- return map;
857
- }
858
- });
957
+ });
958
+ })
959
+ .call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
859
960
 
860
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
961
+ /* eslint-disable es-x/no-function-prototype-bind -- Polyfill imported */
861
962
 
862
- (function(undefined) {
963
+ /**
964
+ * JavaScript enhancements for the ErrorSummary
965
+ *
966
+ * Takes focus on initialisation for accessible announcement, unless disabled in configuration.
967
+ *
968
+ * @class
969
+ * @param {Element} $module - HTML element to use for error summary
970
+ * @param {ErrorSummaryConfig} [config] - Error summary config
971
+ */
972
+ function ErrorSummary ($module, config) {
973
+ // Some consuming code may not be passing a module,
974
+ // for example if they initialise the component
975
+ // on their own by directly passing the result
976
+ // of `document.querySelector`.
977
+ // To avoid breaking further JavaScript initialisation
978
+ // we need to safeguard against this so things keep
979
+ // working the same now we read the elements data attributes
980
+ if (!($module instanceof HTMLElement)) {
981
+ // Little safety in case code gets ported as-is
982
+ // into and ES6 class constructor, where the return value matters
983
+ return this
984
+ }
863
985
 
864
- // Detection from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
865
- var detect = ('trim' in String.prototype);
866
-
867
- if (detect) return
986
+ /** @deprecated Will be made private in v5.0 */
987
+ this.$module = $module;
868
988
 
869
- // Polyfill from https://github.com/mdn/content/blob/cf607d68522cd35ee7670782d3ee3a361eaef2e4/files/en-us/web/javascript/reference/global_objects/string/trim/index.md#polyfill
870
- String.prototype.trim = function () {
871
- return this.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '');
989
+ var defaultConfig = {
990
+ disableAutoFocus: false
872
991
  };
873
992
 
874
- }).call('object' === typeof window && window || 'object' === typeof self && self || 'object' === typeof global && global || {});
875
-
876
- /**
877
- * Normalise string
878
- *
879
- * 'If it looks like a duck, and it quacks like a duck…' 🦆
880
- *
881
- * If the passed value looks like a boolean or a number, convert it to a boolean
882
- * or number.
883
- *
884
- * Designed to be used to convert config passed via data attributes (which are
885
- * always strings) into something sensible.
886
- *
887
- * @param {string} value - The value to normalise
888
- * @returns {string | boolean | number | undefined} Normalised data
889
- */
890
- function normaliseString (value) {
891
- if (typeof value !== 'string') {
892
- return value
993
+ /**
994
+ * @deprecated Will be made private in v5.0
995
+ * @type {ErrorSummaryConfig}
996
+ */
997
+ this.config = mergeConfigs(
998
+ defaultConfig,
999
+ config || {},
1000
+ normaliseDataset($module.dataset)
1001
+ );
893
1002
  }
894
1003
 
895
- var trimmedValue = value.trim();
1004
+ /**
1005
+ * Initialise component
1006
+ */
1007
+ ErrorSummary.prototype.init = function () {
1008
+ // Check that required elements are present
1009
+ if (!this.$module) {
1010
+ return
1011
+ }
896
1012
 
897
- if (trimmedValue === 'true') {
898
- return true
899
- }
1013
+ var $module = this.$module;
900
1014
 
901
- if (trimmedValue === 'false') {
902
- return false
903
- }
1015
+ this.setFocus();
1016
+ $module.addEventListener('click', this.handleClick.bind(this));
1017
+ };
904
1018
 
905
- // Empty / whitespace-only strings are considered finite so we need to check
906
- // the length of the trimmed string as well
907
- if (trimmedValue.length > 0 && isFinite(trimmedValue)) {
908
- return Number(trimmedValue)
909
- }
1019
+ /**
1020
+ * Focus the error summary
1021
+ *
1022
+ * @deprecated Will be made private in v5.0
1023
+ */
1024
+ ErrorSummary.prototype.setFocus = function () {
1025
+ var $module = this.$module;
910
1026
 
911
- return value
912
- }
913
-
914
- /**
915
- * Normalise dataset
916
- *
917
- * Loop over an object and normalise each value using normaliseData function
918
- *
919
- * @param {DOMStringMap} dataset - HTML element dataset
920
- * @returns {Object<string, string | boolean | number | undefined>} Normalised dataset
921
- */
922
- function normaliseDataset (dataset) {
923
- var out = {};
924
-
925
- for (var key in dataset) {
926
- out[key] = normaliseString(dataset[key]);
927
- }
1027
+ if (this.config.disableAutoFocus) {
1028
+ return
1029
+ }
928
1030
 
929
- return out
930
- }
931
-
932
- /**
933
- * JavaScript enhancements for the ErrorSummary
934
- *
935
- * Takes focus on initialisation for accessible announcement, unless disabled in configuration.
936
- *
937
- * @class
938
- * @param {HTMLElement} $module - The element this component controls
939
- * @param {ErrorSummaryConfig} config - Error summary config
940
- */
941
- function ErrorSummary ($module, config) {
942
- // Some consuming code may not be passing a module,
943
- // for example if they initialise the component
944
- // on their own by directly passing the result
945
- // of `document.querySelector`.
946
- // To avoid breaking further JavaScript initialisation
947
- // we need to safeguard against this so things keep
948
- // working the same now we read the elements data attributes
949
- if (!$module) {
950
- // Little safety in case code gets ported as-is
951
- // into and ES6 class constructor, where the return value matters
952
- return this
953
- }
1031
+ // Set tabindex to -1 to make the element programmatically focusable, but
1032
+ // remove it on blur as the error summary doesn't need to be focused again.
1033
+ $module.setAttribute('tabindex', '-1');
954
1034
 
955
- this.$module = $module;
1035
+ $module.addEventListener('blur', function () {
1036
+ $module.removeAttribute('tabindex');
1037
+ });
956
1038
 
957
- var defaultConfig = {
958
- disableAutoFocus: false
1039
+ $module.focus();
959
1040
  };
960
- this.config = mergeConfigs(
961
- defaultConfig,
962
- config || {},
963
- normaliseDataset($module.dataset)
964
- );
965
- }
966
1041
 
967
- ErrorSummary.prototype.init = function () {
968
- var $module = this.$module;
969
- if (!$module) {
970
- return
971
- }
1042
+ /**
1043
+ * Click event handler
1044
+ *
1045
+ * @deprecated Will be made private in v5.0
1046
+ * @param {MouseEvent} event - Click event
1047
+ */
1048
+ ErrorSummary.prototype.handleClick = function (event) {
1049
+ var $target = event.target;
1050
+ if (this.focusTarget($target)) {
1051
+ event.preventDefault();
1052
+ }
1053
+ };
972
1054
 
973
- this.setFocus();
974
- $module.addEventListener('click', this.handleClick.bind(this));
975
- };
1055
+ /**
1056
+ * Focus the target element
1057
+ *
1058
+ * By default, the browser will scroll the target into view. Because our labels
1059
+ * or legends appear above the input, this means the user will be presented with
1060
+ * an input without any context, as the label or legend will be off the top of
1061
+ * the screen.
1062
+ *
1063
+ * Manually handling the click event, scrolling the question into view and then
1064
+ * focussing the element solves this.
1065
+ *
1066
+ * This also results in the label and/or legend being announced correctly in
1067
+ * NVDA (as tested in 2018.3.2) - without this only the field type is announced
1068
+ * (e.g. "Edit, has autocomplete").
1069
+ *
1070
+ * @deprecated Will be made private in v5.0
1071
+ * @param {EventTarget} $target - Event target
1072
+ * @returns {boolean} True if the target was able to be focussed
1073
+ */
1074
+ ErrorSummary.prototype.focusTarget = function ($target) {
1075
+ // If the element that was clicked was not a link, return early
1076
+ if (!($target instanceof HTMLAnchorElement)) {
1077
+ return false
1078
+ }
976
1079
 
977
- /**
978
- * Focus the error summary
979
- */
980
- ErrorSummary.prototype.setFocus = function () {
981
- var $module = this.$module;
1080
+ var inputId = this.getFragmentFromUrl($target.href);
1081
+ if (!inputId) {
1082
+ return false
1083
+ }
982
1084
 
983
- if (this.config.disableAutoFocus) {
984
- return
985
- }
1085
+ var $input = document.getElementById(inputId);
1086
+ if (!$input) {
1087
+ return false
1088
+ }
986
1089
 
987
- // Set tabindex to -1 to make the element programmatically focusable, but
988
- // remove it on blur as the error summary doesn't need to be focused again.
989
- $module.setAttribute('tabindex', '-1');
990
-
991
- $module.addEventListener('blur', function () {
992
- $module.removeAttribute('tabindex');
993
- });
994
-
995
- $module.focus();
996
- };
997
-
998
- /**
999
- * Click event handler
1000
- *
1001
- * @param {MouseEvent} event - Click event
1002
- */
1003
- ErrorSummary.prototype.handleClick = function (event) {
1004
- var target = event.target;
1005
- if (this.focusTarget(target)) {
1006
- event.preventDefault();
1007
- }
1008
- };
1009
-
1010
- /**
1011
- * Focus the target element
1012
- *
1013
- * By default, the browser will scroll the target into view. Because our labels
1014
- * or legends appear above the input, this means the user will be presented with
1015
- * an input without any context, as the label or legend will be off the top of
1016
- * the screen.
1017
- *
1018
- * Manually handling the click event, scrolling the question into view and then
1019
- * focussing the element solves this.
1020
- *
1021
- * This also results in the label and/or legend being announced correctly in
1022
- * NVDA (as tested in 2018.3.2) - without this only the field type is announced
1023
- * (e.g. "Edit, has autocomplete").
1024
- *
1025
- * @param {HTMLElement} $target - Event target
1026
- * @returns {boolean} True if the target was able to be focussed
1027
- */
1028
- ErrorSummary.prototype.focusTarget = function ($target) {
1029
- // If the element that was clicked was not a link, return early
1030
- if ($target.tagName !== 'A' || $target.href === false) {
1031
- return false
1032
- }
1090
+ var $legendOrLabel = this.getAssociatedLegendOrLabel($input);
1091
+ if (!$legendOrLabel) {
1092
+ return false
1093
+ }
1033
1094
 
1034
- var inputId = this.getFragmentFromUrl($target.href);
1035
- var $input = document.getElementById(inputId);
1036
- if (!$input) {
1037
- return false
1038
- }
1095
+ // Scroll the legend or label into view *before* calling focus on the input to
1096
+ // avoid extra scrolling in browsers that don't support `preventScroll` (which
1097
+ // at time of writing is most of them...)
1098
+ $legendOrLabel.scrollIntoView();
1099
+ $input.focus({ preventScroll: true });
1039
1100
 
1040
- var $legendOrLabel = this.getAssociatedLegendOrLabel($input);
1041
- if (!$legendOrLabel) {
1042
- return false
1043
- }
1101
+ return true
1102
+ };
1044
1103
 
1045
- // Scroll the legend or label into view *before* calling focus on the input to
1046
- // avoid extra scrolling in browsers that don't support `preventScroll` (which
1047
- // at time of writing is most of them...)
1048
- $legendOrLabel.scrollIntoView();
1049
- $input.focus({ preventScroll: true });
1050
-
1051
- return true
1052
- };
1053
-
1054
- /**
1055
- * Get fragment from URL
1056
- *
1057
- * Extract the fragment (everything after the hash) from a URL, but not including
1058
- * the hash.
1059
- *
1060
- * @param {string} url - URL
1061
- * @returns {string} Fragment from URL, without the hash
1062
- */
1063
- ErrorSummary.prototype.getFragmentFromUrl = function (url) {
1064
- if (url.indexOf('#') === -1) {
1065
- return false
1066
- }
1104
+ /**
1105
+ * Get fragment from URL
1106
+ *
1107
+ * Extract the fragment (everything after the hash) from a URL, but not including
1108
+ * the hash.
1109
+ *
1110
+ * @deprecated Will be made private in v5.0
1111
+ * @param {string} url - URL
1112
+ * @returns {string | undefined} Fragment from URL, without the hash
1113
+ */
1114
+ ErrorSummary.prototype.getFragmentFromUrl = function (url) {
1115
+ if (url.indexOf('#') === -1) {
1116
+ return undefined
1117
+ }
1067
1118
 
1068
- return url.split('#').pop()
1069
- };
1070
-
1071
- /**
1072
- * Get associated legend or label
1073
- *
1074
- * Returns the first element that exists from this list:
1075
- *
1076
- * - The `<legend>` associated with the closest `<fieldset>` ancestor, as long
1077
- * as the top of it is no more than half a viewport height away from the
1078
- * bottom of the input
1079
- * - The first `<label>` that is associated with the input using for="inputId"
1080
- * - The closest parent `<label>`
1081
- *
1082
- * @param {HTMLElement} $input - The input
1083
- * @returns {HTMLElement} Associated legend or label, or null if no associated
1084
- * legend or label can be found
1085
- */
1086
- ErrorSummary.prototype.getAssociatedLegendOrLabel = function ($input) {
1087
- var $fieldset = $input.closest('fieldset');
1088
-
1089
- if ($fieldset) {
1090
- var legends = $fieldset.getElementsByTagName('legend');
1091
-
1092
- if (legends.length) {
1093
- var $candidateLegend = legends[0];
1094
-
1095
- // If the input type is radio or checkbox, always use the legend if there
1096
- // is one.
1097
- if ($input.type === 'checkbox' || $input.type === 'radio') {
1098
- return $candidateLegend
1099
- }
1119
+ return url.split('#').pop()
1120
+ };
1121
+
1122
+ /**
1123
+ * Get associated legend or label
1124
+ *
1125
+ * Returns the first element that exists from this list:
1126
+ *
1127
+ * - The `<legend>` associated with the closest `<fieldset>` ancestor, as long
1128
+ * as the top of it is no more than half a viewport height away from the
1129
+ * bottom of the input
1130
+ * - The first `<label>` that is associated with the input using for="inputId"
1131
+ * - The closest parent `<label>`
1132
+ *
1133
+ * @deprecated Will be made private in v5.0
1134
+ * @param {Element} $input - The input
1135
+ * @returns {Element | null} Associated legend or label, or null if no associated
1136
+ * legend or label can be found
1137
+ */
1138
+ ErrorSummary.prototype.getAssociatedLegendOrLabel = function ($input) {
1139
+ var $fieldset = $input.closest('fieldset');
1140
+
1141
+ if ($fieldset) {
1142
+ var $legends = $fieldset.getElementsByTagName('legend');
1100
1143
 
1101
- // For other input types, only scroll to the fieldset’s legend (instead of
1102
- // the label associated with the input) if the input would end up in the
1103
- // top half of the screen.
1104
- //
1105
- // This should avoid situations where the input either ends up off the
1106
- // screen, or obscured by a software keyboard.
1107
- var legendTop = $candidateLegend.getBoundingClientRect().top;
1108
- var inputRect = $input.getBoundingClientRect();
1109
-
1110
- // If the browser doesn't support Element.getBoundingClientRect().height
1111
- // or window.innerHeight (like IE8), bail and just link to the label.
1112
- if (inputRect.height && window.innerHeight) {
1113
- var inputBottom = inputRect.top + inputRect.height;
1114
-
1115
- if (inputBottom - legendTop < window.innerHeight / 2) {
1144
+ if ($legends.length) {
1145
+ var $candidateLegend = $legends[0];
1146
+
1147
+ // If the input type is radio or checkbox, always use the legend if there
1148
+ // is one.
1149
+ if ($input instanceof HTMLInputElement && ($input.type === 'checkbox' || $input.type === 'radio')) {
1116
1150
  return $candidateLegend
1117
1151
  }
1152
+
1153
+ // For other input types, only scroll to the fieldset’s legend (instead of
1154
+ // the label associated with the input) if the input would end up in the
1155
+ // top half of the screen.
1156
+ //
1157
+ // This should avoid situations where the input either ends up off the
1158
+ // screen, or obscured by a software keyboard.
1159
+ var legendTop = $candidateLegend.getBoundingClientRect().top;
1160
+ var inputRect = $input.getBoundingClientRect();
1161
+
1162
+ // If the browser doesn't support Element.getBoundingClientRect().height
1163
+ // or window.innerHeight (like IE8), bail and just link to the label.
1164
+ if (inputRect.height && window.innerHeight) {
1165
+ var inputBottom = inputRect.top + inputRect.height;
1166
+
1167
+ if (inputBottom - legendTop < window.innerHeight / 2) {
1168
+ return $candidateLegend
1169
+ }
1170
+ }
1118
1171
  }
1119
1172
  }
1120
- }
1121
1173
 
1122
- return document.querySelector("label[for='" + $input.getAttribute('id') + "']") ||
1123
- $input.closest('label')
1124
- };
1174
+ return document.querySelector("label[for='" + $input.getAttribute('id') + "']") ||
1175
+ $input.closest('label')
1176
+ };
1125
1177
 
1126
- /**
1127
- * Error summary config
1128
- *
1129
- * @typedef {object} ErrorSummaryConfig
1130
- * @property {boolean} [disableAutoFocus = false] -
1131
- * If set to `true` the error summary will not be focussed when the page loads.
1132
- */
1178
+ /**
1179
+ * Error summary config
1180
+ *
1181
+ * @typedef {object} ErrorSummaryConfig
1182
+ * @property {boolean} [disableAutoFocus = false] - If set to `true` the error
1183
+ * summary will not be focussed when the page loads.
1184
+ */
1133
1185
 
1134
- return ErrorSummary;
1186
+ return ErrorSummary;
1135
1187
 
1136
1188
  })));
1189
+ //# sourceMappingURL=error-summary.js.map