core-js 3.18.2 → 3.19.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (334) hide show
  1. package/es/date/to-primitive.js +2 -3
  2. package/es/date/to-string.js +2 -4
  3. package/es/instance/at.js +6 -5
  4. package/es/instance/bind.js +3 -2
  5. package/es/instance/code-point-at.js +4 -3
  6. package/es/instance/concat.js +3 -2
  7. package/es/instance/copy-within.js +3 -2
  8. package/es/instance/ends-with.js +4 -3
  9. package/es/instance/entries.js +3 -2
  10. package/es/instance/every.js +3 -2
  11. package/es/instance/fill.js +3 -2
  12. package/es/instance/filter.js +3 -2
  13. package/es/instance/find-index.js +3 -2
  14. package/es/instance/find.js +3 -2
  15. package/es/instance/flags.js +2 -1
  16. package/es/instance/flat-map.js +3 -2
  17. package/es/instance/flat.js +3 -2
  18. package/es/instance/for-each.js +3 -2
  19. package/es/instance/includes.js +6 -5
  20. package/es/instance/index-of.js +3 -2
  21. package/es/instance/keys.js +3 -2
  22. package/es/instance/last-index-of.js +3 -2
  23. package/es/instance/map.js +3 -2
  24. package/es/instance/match-all.js +4 -3
  25. package/es/instance/pad-end.js +4 -3
  26. package/es/instance/pad-start.js +4 -3
  27. package/es/instance/reduce-right.js +3 -2
  28. package/es/instance/reduce.js +3 -2
  29. package/es/instance/repeat.js +4 -3
  30. package/es/instance/replace-all.js +4 -3
  31. package/es/instance/reverse.js +3 -2
  32. package/es/instance/slice.js +3 -2
  33. package/es/instance/some.js +3 -2
  34. package/es/instance/sort.js +3 -2
  35. package/es/instance/splice.js +3 -2
  36. package/es/instance/starts-with.js +4 -3
  37. package/es/instance/trim-end.js +4 -3
  38. package/es/instance/trim-left.js +4 -3
  39. package/es/instance/trim-right.js +4 -3
  40. package/es/instance/trim-start.js +4 -3
  41. package/es/instance/trim.js +4 -3
  42. package/es/instance/values.js +3 -2
  43. package/es/json/stringify.js +4 -3
  44. package/es/promise/all-settled.js +2 -1
  45. package/es/promise/any.js +2 -1
  46. package/es/regexp/flags.js +3 -4
  47. package/es/regexp/match.js +2 -1
  48. package/es/regexp/replace.js +2 -1
  49. package/es/regexp/search.js +2 -1
  50. package/es/regexp/split.js +2 -1
  51. package/es/regexp/test.js +2 -3
  52. package/es/regexp/to-string.js +2 -3
  53. package/es/string/iterator.js +2 -5
  54. package/features/instance/at.js +6 -5
  55. package/features/instance/code-points.js +4 -3
  56. package/features/instance/filter-out.js +3 -2
  57. package/features/instance/filter-reject.js +3 -2
  58. package/features/instance/find-last-index.js +3 -2
  59. package/features/instance/find-last.js +3 -2
  60. package/features/instance/group-by.js +3 -2
  61. package/features/instance/unique-by.js +3 -2
  62. package/features/map/from.js +3 -2
  63. package/features/map/group-by.js +2 -1
  64. package/features/map/key-by.js +2 -1
  65. package/features/map/of.js +3 -2
  66. package/features/promise/try.js +2 -1
  67. package/features/set/from.js +3 -2
  68. package/features/set/of.js +3 -2
  69. package/features/weak-map/from.js +3 -2
  70. package/features/weak-map/of.js +3 -2
  71. package/features/weak-set/from.js +3 -2
  72. package/features/weak-set/of.js +3 -2
  73. package/internals/a-callable.js +3 -0
  74. package/internals/a-constructor.js +3 -0
  75. package/internals/a-possible-prototype.js +5 -1
  76. package/internals/an-instance.js +8 -3
  77. package/internals/an-object.js +4 -0
  78. package/internals/array-buffer-native.js +1 -1
  79. package/internals/array-buffer-non-extensible.js +10 -0
  80. package/internals/array-buffer-view-core.js +3 -2
  81. package/internals/array-buffer.js +29 -16
  82. package/internals/array-from-async.js +1 -1
  83. package/internals/array-from.js +6 -2
  84. package/internals/array-group-by.js +6 -3
  85. package/internals/array-iteration-from-last.js +1 -1
  86. package/internals/array-iteration.js +5 -4
  87. package/internals/array-last-index-of.js +2 -1
  88. package/internals/array-reduce.js +3 -0
  89. package/internals/array-slice-simple.js +17 -0
  90. package/internals/array-slice.js +3 -0
  91. package/internals/array-sort.js +10 -11
  92. package/internals/array-species-constructor.js +2 -0
  93. package/internals/array-unique-by.js +13 -9
  94. package/internals/async-from-sync-iterator.js +4 -3
  95. package/internals/async-iterator-create-proxy.js +4 -3
  96. package/internals/async-iterator-iteration.js +5 -2
  97. package/internals/classof-raw.js +5 -2
  98. package/internals/classof.js +3 -0
  99. package/internals/clear-error-stack.js +20 -0
  100. package/internals/collection-add-all.js +3 -2
  101. package/internals/collection-delete-all.js +3 -2
  102. package/internals/collection-from.js +7 -4
  103. package/internals/collection-of.js +3 -4
  104. package/internals/collection-strong.js +11 -9
  105. package/internals/collection-weak.js +10 -6
  106. package/internals/collection.js +8 -7
  107. package/internals/composite-key.js +9 -2
  108. package/internals/create-html.js +3 -1
  109. package/internals/date-to-iso-string.js +23 -13
  110. package/internals/date-to-primitive.js +3 -0
  111. package/internals/define-iterator.js +2 -1
  112. package/internals/engine-v8-version.js +10 -4
  113. package/internals/entry-unbind.js +3 -5
  114. package/internals/error-stack-installable.js +10 -0
  115. package/internals/export.js +1 -1
  116. package/internals/fix-regexp-well-known-symbol-logic.js +5 -3
  117. package/internals/flatten-into-array.js +4 -1
  118. package/internals/function-apply.js +9 -0
  119. package/internals/function-bind-context.js +5 -17
  120. package/internals/function-bind.js +15 -9
  121. package/internals/function-call.js +5 -0
  122. package/internals/function-uncurry-this.js +12 -0
  123. package/internals/get-async-iterator.js +2 -1
  124. package/internals/get-iterator.js +7 -2
  125. package/internals/get-map-iterator.js +3 -1
  126. package/internals/get-set-iterator.js +3 -1
  127. package/internals/get-substitution.js +10 -7
  128. package/internals/has-own-property.js +3 -2
  129. package/internals/host-report-errors.js +1 -1
  130. package/internals/ieee754.js +24 -6
  131. package/internals/indexed-object.js +5 -2
  132. package/internals/inspect-source.js +3 -2
  133. package/internals/install-error-cause.js +1 -1
  134. package/internals/internal-metadata.js +4 -7
  135. package/internals/internal-state.js +9 -7
  136. package/internals/is-callable.js +1 -1
  137. package/internals/is-constructor.js +6 -4
  138. package/internals/is-iterable.js +4 -2
  139. package/internals/is-object.js +1 -1
  140. package/internals/is-symbol.js +6 -2
  141. package/internals/iterate.js +14 -6
  142. package/internals/iterator-close.js +2 -1
  143. package/internals/iterator-create-proxy.js +4 -3
  144. package/internals/map-emplace.js +8 -3
  145. package/internals/map-upsert.js +12 -4
  146. package/internals/math-scale.js +9 -12
  147. package/internals/microtask.js +6 -4
  148. package/internals/normalize-string-argument.js +5 -0
  149. package/internals/not-a-regexp.js +3 -0
  150. package/internals/number-parse-float.js +8 -6
  151. package/internals/number-parse-int.js +4 -2
  152. package/internals/numeric-range-iterator.js +4 -0
  153. package/internals/object-assign.js +5 -2
  154. package/internals/object-define-properties.js +3 -1
  155. package/internals/object-define-property.js +2 -0
  156. package/internals/object-get-own-property-descriptor.js +2 -1
  157. package/internals/object-get-own-property-names-external.js +4 -4
  158. package/internals/object-get-prototype-of.js +2 -1
  159. package/internals/object-is-extensible.js +16 -0
  160. package/internals/object-is-prototype-of.js +3 -0
  161. package/internals/object-keys-internal.js +5 -2
  162. package/internals/object-set-prototype-of.js +4 -3
  163. package/internals/object-to-array.js +7 -3
  164. package/internals/ordinary-to-primitive.js +7 -3
  165. package/internals/own-keys.js +4 -1
  166. package/internals/reflect-metadata.js +9 -3
  167. package/internals/regexp-exec-abstract.js +6 -2
  168. package/internals/regexp-exec.js +20 -16
  169. package/internals/regexp-sticky-helpers.js +14 -2
  170. package/internals/require-object-coercible.js +4 -0
  171. package/internals/set-global.js +4 -2
  172. package/internals/shared.js +1 -1
  173. package/internals/string-multibyte.js +13 -4
  174. package/internals/string-pad.js +6 -3
  175. package/internals/string-punycode-to-ascii.js +34 -20
  176. package/internals/string-repeat.js +3 -0
  177. package/internals/string-trim.js +4 -2
  178. package/internals/task.js +11 -11
  179. package/internals/this-number-value.js +2 -4
  180. package/internals/to-index.js +3 -0
  181. package/internals/to-object.js +3 -0
  182. package/internals/to-offset.js +3 -0
  183. package/internals/to-positive-integer.js +3 -0
  184. package/internals/to-primitive.js +4 -1
  185. package/internals/to-property-key.js +1 -1
  186. package/internals/to-string.js +3 -0
  187. package/internals/try-to-string.js +4 -0
  188. package/internals/typed-array-constructor.js +10 -6
  189. package/internals/typed-array-from.js +4 -3
  190. package/internals/uid.js +4 -1
  191. package/internals/well-known-symbol.js +5 -1
  192. package/modules/es.aggregate-error.js +27 -11
  193. package/modules/es.array-buffer.slice.js +8 -4
  194. package/modules/es.array.concat.js +2 -0
  195. package/modules/es.array.index-of.js +7 -5
  196. package/modules/es.array.join.js +3 -2
  197. package/modules/es.array.of.js +3 -1
  198. package/modules/es.array.reduce.js +2 -1
  199. package/modules/es.array.reverse.js +3 -2
  200. package/modules/es.array.slice.js +4 -2
  201. package/modules/es.array.sort.js +7 -4
  202. package/modules/es.array.splice.js +2 -0
  203. package/modules/es.date.get-year.js +3 -2
  204. package/modules/es.date.now.js +6 -1
  205. package/modules/es.date.set-year.js +6 -4
  206. package/modules/es.date.to-primitive.js +2 -1
  207. package/modules/es.date.to-string.js +5 -4
  208. package/modules/es.escape.js +12 -5
  209. package/modules/es.function.has-instance.js +3 -2
  210. package/modules/es.function.name.js +5 -3
  211. package/modules/es.json.stringify.js +18 -7
  212. package/modules/es.map.js +1 -1
  213. package/modules/es.number.constructor.js +12 -7
  214. package/modules/es.number.to-fixed.js +19 -13
  215. package/modules/es.number.to-precision.js +6 -5
  216. package/modules/es.object.is-extensible.js +4 -10
  217. package/modules/es.object.is-frozen.js +6 -2
  218. package/modules/es.object.is-sealed.js +6 -2
  219. package/modules/es.promise.all-settled.js +2 -2
  220. package/modules/es.promise.any.js +5 -4
  221. package/modules/es.promise.js +22 -18
  222. package/modules/es.reflect.apply.js +4 -10
  223. package/modules/es.reflect.construct.js +10 -5
  224. package/modules/es.reflect.get.js +2 -1
  225. package/modules/es.reflect.is-extensible.js +2 -4
  226. package/modules/es.reflect.set.js +2 -1
  227. package/modules/es.regexp.constructor.js +26 -16
  228. package/modules/es.regexp.dot-all.js +5 -1
  229. package/modules/es.regexp.flags.js +4 -2
  230. package/modules/es.regexp.sticky.js +7 -3
  231. package/modules/es.regexp.test.js +7 -3
  232. package/modules/es.regexp.to-string.js +8 -5
  233. package/modules/es.set.js +1 -1
  234. package/modules/es.string.at-alternative.js +4 -1
  235. package/modules/es.string.ends-with.js +6 -4
  236. package/modules/es.string.from-code-point.js +7 -4
  237. package/modules/es.string.includes.js +8 -2
  238. package/modules/es.string.match-all.js +25 -19
  239. package/modules/es.string.match.js +2 -1
  240. package/modules/es.string.raw.js +6 -6
  241. package/modules/es.string.replace-all.js +19 -13
  242. package/modules/es.string.replace.js +19 -12
  243. package/modules/es.string.search.js +2 -1
  244. package/modules/es.string.split.js +23 -16
  245. package/modules/es.string.starts-with.js +6 -4
  246. package/modules/es.string.substr.js +3 -2
  247. package/modules/es.symbol.description.js +20 -12
  248. package/modules/es.symbol.js +34 -21
  249. package/modules/es.typed-array.copy-within.js +4 -2
  250. package/modules/es.typed-array.fill.js +9 -2
  251. package/modules/es.typed-array.iterator.js +7 -6
  252. package/modules/es.typed-array.join.js +3 -3
  253. package/modules/es.typed-array.last-index-of.js +3 -2
  254. package/modules/es.typed-array.reduce-right.js +2 -1
  255. package/modules/es.typed-array.reduce.js +2 -1
  256. package/modules/es.typed-array.set.js +2 -0
  257. package/modules/es.typed-array.slice.js +2 -2
  258. package/modules/es.typed-array.sort.js +13 -28
  259. package/modules/es.typed-array.to-locale-string.js +7 -2
  260. package/modules/es.typed-array.to-string.js +3 -2
  261. package/modules/es.unescape.js +14 -9
  262. package/modules/es.weak-map.js +15 -15
  263. package/modules/esnext.array.is-template-object.js +1 -1
  264. package/modules/esnext.async-iterator.as-indexed-pairs.js +2 -1
  265. package/modules/esnext.async-iterator.constructor.js +1 -1
  266. package/modules/esnext.async-iterator.drop.js +2 -1
  267. package/modules/esnext.async-iterator.filter.js +2 -1
  268. package/modules/esnext.async-iterator.flat-map.js +3 -2
  269. package/modules/esnext.async-iterator.from.js +4 -4
  270. package/modules/esnext.async-iterator.map.js +2 -1
  271. package/modules/esnext.async-iterator.reduce.js +4 -1
  272. package/modules/esnext.async-iterator.take.js +4 -2
  273. package/modules/esnext.composite-key.js +5 -1
  274. package/modules/esnext.composite-symbol.js +3 -2
  275. package/modules/esnext.iterator.as-indexed-pairs.js +2 -1
  276. package/modules/esnext.iterator.constructor.js +1 -1
  277. package/modules/esnext.iterator.drop.js +4 -2
  278. package/modules/esnext.iterator.filter.js +2 -1
  279. package/modules/esnext.iterator.flat-map.js +7 -3
  280. package/modules/esnext.iterator.from.js +4 -4
  281. package/modules/esnext.iterator.map.js +2 -1
  282. package/modules/esnext.iterator.reduce.js +3 -0
  283. package/modules/esnext.iterator.take.js +2 -1
  284. package/modules/esnext.map.delete-all.js +2 -4
  285. package/modules/esnext.map.emplace.js +2 -2
  286. package/modules/esnext.map.every.js +1 -1
  287. package/modules/esnext.map.filter.js +5 -4
  288. package/modules/esnext.map.find-key.js +1 -1
  289. package/modules/esnext.map.find.js +1 -1
  290. package/modules/esnext.map.group-by.js +6 -2
  291. package/modules/esnext.map.includes.js +1 -1
  292. package/modules/esnext.map.key-by.js +2 -1
  293. package/modules/esnext.map.map-keys.js +5 -4
  294. package/modules/esnext.map.map-values.js +5 -4
  295. package/modules/esnext.map.reduce.js +3 -0
  296. package/modules/esnext.map.some.js +1 -1
  297. package/modules/esnext.map.update-or-insert.js +2 -2
  298. package/modules/esnext.map.update.js +11 -4
  299. package/modules/esnext.map.upsert.js +2 -2
  300. package/modules/esnext.math.seeded-prng.js +3 -1
  301. package/modules/esnext.number.from-string.js +12 -3
  302. package/modules/esnext.observable.js +14 -9
  303. package/modules/esnext.reflect.get-metadata-keys.js +5 -10
  304. package/modules/esnext.set.add-all.js +2 -4
  305. package/modules/esnext.set.delete-all.js +2 -4
  306. package/modules/esnext.set.difference.js +3 -2
  307. package/modules/esnext.set.every.js +1 -1
  308. package/modules/esnext.set.filter.js +4 -3
  309. package/modules/esnext.set.find.js +1 -1
  310. package/modules/esnext.set.intersection.js +3 -2
  311. package/modules/esnext.set.is-disjoint-from.js +3 -2
  312. package/modules/esnext.set.is-subset-of.js +3 -2
  313. package/modules/esnext.set.is-superset-of.js +3 -2
  314. package/modules/esnext.set.join.js +9 -4
  315. package/modules/esnext.set.map.js +5 -4
  316. package/modules/esnext.set.reduce.js +3 -0
  317. package/modules/esnext.set.some.js +1 -1
  318. package/modules/esnext.set.symmetric-difference.js +3 -2
  319. package/modules/esnext.typed-array.from-async.js +0 -1
  320. package/modules/esnext.typed-array.unique-by.js +4 -2
  321. package/modules/esnext.weak-map.delete-all.js +2 -4
  322. package/modules/esnext.weak-map.emplace.js +2 -2
  323. package/modules/esnext.weak-map.upsert.js +2 -2
  324. package/modules/esnext.weak-set.add-all.js +2 -4
  325. package/modules/esnext.weak-set.delete-all.js +2 -4
  326. package/modules/web.timers.js +5 -4
  327. package/modules/web.url-search-params.js +122 -104
  328. package/modules/web.url.js +664 -628
  329. package/modules/web.url.to-json.js +2 -1
  330. package/package.json +2 -2
  331. package/stable/instance/entries.js +6 -4
  332. package/stable/instance/for-each.js +6 -4
  333. package/stable/instance/keys.js +6 -4
  334. package/stable/instance/values.js +6 -4
@@ -5,12 +5,15 @@ var $ = require('../internals/export');
5
5
  var DESCRIPTORS = require('../internals/descriptors');
6
6
  var USE_NATIVE_URL = require('../internals/native-url');
7
7
  var global = require('../internals/global');
8
+ var bind = require('../internals/function-bind-context');
9
+ var uncurryThis = require('../internals/function-uncurry-this');
8
10
  var defineProperties = require('../internals/object-define-properties');
9
11
  var redefine = require('../internals/redefine');
10
12
  var anInstance = require('../internals/an-instance');
11
13
  var hasOwn = require('../internals/has-own-property');
12
14
  var assign = require('../internals/object-assign');
13
15
  var arrayFrom = require('../internals/array-from');
16
+ var arraySlice = require('../internals/array-slice-simple');
14
17
  var codeAt = require('../internals/string-multibyte').codeAt;
15
18
  var toASCII = require('../internals/string-punycode-to-ascii');
16
19
  var $toString = require('../internals/to-string');
@@ -18,27 +21,42 @@ var setToStringTag = require('../internals/set-to-string-tag');
18
21
  var URLSearchParamsModule = require('../modules/web.url-search-params');
19
22
  var InternalStateModule = require('../internals/internal-state');
20
23
 
21
- var NativeURL = global.URL;
22
- var URLSearchParams = URLSearchParamsModule.URLSearchParams;
23
- var getInternalSearchParamsState = URLSearchParamsModule.getState;
24
24
  var setInternalState = InternalStateModule.set;
25
25
  var getInternalURLState = InternalStateModule.getterFor('URL');
26
+ var URLSearchParams = URLSearchParamsModule.URLSearchParams;
27
+ var getInternalSearchParamsState = URLSearchParamsModule.getState;
28
+
29
+ var NativeURL = global.URL;
30
+ var TypeError = global.TypeError;
31
+ var parseInt = global.parseInt;
26
32
  var floor = Math.floor;
27
33
  var pow = Math.pow;
34
+ var charAt = uncurryThis(''.charAt);
35
+ var exec = uncurryThis(/./.exec);
36
+ var join = uncurryThis([].join);
37
+ var numberToString = uncurryThis(1.0.toString);
38
+ var pop = uncurryThis([].pop);
39
+ var push = uncurryThis([].push);
40
+ var replace = uncurryThis(''.replace);
41
+ var shift = uncurryThis([].shift);
42
+ var split = uncurryThis(''.split);
43
+ var stringSlice = uncurryThis(''.slice);
44
+ var toLowerCase = uncurryThis(''.toLowerCase);
45
+ var unshift = uncurryThis([].unshift);
28
46
 
29
47
  var INVALID_AUTHORITY = 'Invalid authority';
30
48
  var INVALID_SCHEME = 'Invalid scheme';
31
49
  var INVALID_HOST = 'Invalid host';
32
50
  var INVALID_PORT = 'Invalid port';
33
51
 
34
- var ALPHA = /[A-Za-z]/;
52
+ var ALPHA = /[a-z]/i;
35
53
  // eslint-disable-next-line regexp/no-obscure-range -- safe
36
- var ALPHANUMERIC = /[\d+-.A-Za-z]/;
54
+ var ALPHANUMERIC = /[\d+-.a-z]/i;
37
55
  var DIGIT = /\d/;
38
56
  var HEX_START = /^0x/i;
39
57
  var OCT = /^[0-7]+$/;
40
58
  var DEC = /^\d+$/;
41
- var HEX = /^[\dA-Fa-f]+$/;
59
+ var HEX = /^[\da-f]+$/i;
42
60
  /* eslint-disable regexp/no-control-character -- safe */
43
61
  var FORBIDDEN_HOST_CODE_POINT = /[\0\t\n\r #%/:<>?@[\\\]^|]/;
44
62
  var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\0\t\n\r #/:<>?@[\\\]^|]/;
@@ -47,36 +65,12 @@ var TAB_AND_NEW_LINE = /[\t\n\r]/g;
47
65
  /* eslint-enable regexp/no-control-character -- safe */
48
66
  var EOF;
49
67
 
50
- var parseHost = function (url, input) {
51
- var result, codePoints, index;
52
- if (input.charAt(0) == '[') {
53
- if (input.charAt(input.length - 1) != ']') return INVALID_HOST;
54
- result = parseIPv6(input.slice(1, -1));
55
- if (!result) return INVALID_HOST;
56
- url.host = result;
57
- // opaque host
58
- } else if (!isSpecial(url)) {
59
- if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;
60
- result = '';
61
- codePoints = arrayFrom(input);
62
- for (index = 0; index < codePoints.length; index++) {
63
- result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
64
- }
65
- url.host = result;
66
- } else {
67
- input = toASCII(input);
68
- if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;
69
- result = parseIPv4(input);
70
- if (result === null) return INVALID_HOST;
71
- url.host = result;
72
- }
73
- };
74
-
68
+ // https://url.spec.whatwg.org/#ipv4-number-parser
75
69
  var parseIPv4 = function (input) {
76
- var parts = input.split('.');
70
+ var parts = split(input, '.');
77
71
  var partsLength, numbers, index, part, radix, number, ipv4;
78
72
  if (parts.length && parts[parts.length - 1] == '') {
79
- parts.pop();
73
+ parts.length--;
80
74
  }
81
75
  partsLength = parts.length;
82
76
  if (partsLength > 4) return input;
@@ -85,17 +79,17 @@ var parseIPv4 = function (input) {
85
79
  part = parts[index];
86
80
  if (part == '') return input;
87
81
  radix = 10;
88
- if (part.length > 1 && part.charAt(0) == '0') {
89
- radix = HEX_START.test(part) ? 16 : 8;
90
- part = part.slice(radix == 8 ? 1 : 2);
82
+ if (part.length > 1 && charAt(part, 0) == '0') {
83
+ radix = exec(HEX_START, part) ? 16 : 8;
84
+ part = stringSlice(part, radix == 8 ? 1 : 2);
91
85
  }
92
86
  if (part === '') {
93
87
  number = 0;
94
88
  } else {
95
- if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;
89
+ if (!exec(radix == 10 ? DEC : radix == 8 ? OCT : HEX, part)) return input;
96
90
  number = parseInt(part, radix);
97
91
  }
98
- numbers.push(number);
92
+ push(numbers, number);
99
93
  }
100
94
  for (index = 0; index < partsLength; index++) {
101
95
  number = numbers[index];
@@ -103,13 +97,14 @@ var parseIPv4 = function (input) {
103
97
  if (number >= pow(256, 5 - partsLength)) return null;
104
98
  } else if (number > 255) return null;
105
99
  }
106
- ipv4 = numbers.pop();
100
+ ipv4 = pop(numbers);
107
101
  for (index = 0; index < numbers.length; index++) {
108
102
  ipv4 += numbers[index] * pow(256, 3 - index);
109
103
  }
110
104
  return ipv4;
111
105
  };
112
106
 
107
+ // https://url.spec.whatwg.org/#concept-ipv6-parser
113
108
  // eslint-disable-next-line max-statements -- TODO
114
109
  var parseIPv6 = function (input) {
115
110
  var address = [0, 0, 0, 0, 0, 0, 0, 0];
@@ -119,11 +114,11 @@ var parseIPv6 = function (input) {
119
114
  var value, length, numbersSeen, ipv4Piece, number, swaps, swap;
120
115
 
121
116
  var chr = function () {
122
- return input.charAt(pointer);
117
+ return charAt(input, pointer);
123
118
  };
124
119
 
125
120
  if (chr() == ':') {
126
- if (input.charAt(1) != ':') return;
121
+ if (charAt(input, 1) != ':') return;
127
122
  pointer += 2;
128
123
  pieceIndex++;
129
124
  compress = pieceIndex;
@@ -138,7 +133,7 @@ var parseIPv6 = function (input) {
138
133
  continue;
139
134
  }
140
135
  value = length = 0;
141
- while (length < 4 && HEX.test(chr())) {
136
+ while (length < 4 && exec(HEX, chr())) {
142
137
  value = value * 16 + parseInt(chr(), 16);
143
138
  pointer++;
144
139
  length++;
@@ -154,8 +149,8 @@ var parseIPv6 = function (input) {
154
149
  if (chr() == '.' && numbersSeen < 4) pointer++;
155
150
  else return;
156
151
  }
157
- if (!DIGIT.test(chr())) return;
158
- while (DIGIT.test(chr())) {
152
+ if (!exec(DIGIT, chr())) return;
153
+ while (exec(DIGIT, chr())) {
159
154
  number = parseInt(chr(), 10);
160
155
  if (ipv4Piece === null) ipv4Piece = number;
161
156
  else if (ipv4Piece == 0) return;
@@ -213,15 +208,16 @@ var findLongestZeroSequence = function (ipv6) {
213
208
  return maxIndex;
214
209
  };
215
210
 
211
+ // https://url.spec.whatwg.org/#host-serializing
216
212
  var serializeHost = function (host) {
217
213
  var result, index, compress, ignore0;
218
214
  // ipv4
219
215
  if (typeof host == 'number') {
220
216
  result = [];
221
217
  for (index = 0; index < 4; index++) {
222
- result.unshift(host % 256);
218
+ unshift(result, host % 256);
223
219
  host = floor(host / 256);
224
- } return result.join('.');
220
+ } return join(result, '.');
225
221
  // ipv6
226
222
  } else if (typeof host == 'object') {
227
223
  result = '';
@@ -233,7 +229,7 @@ var serializeHost = function (host) {
233
229
  result += index ? ':' : '::';
234
230
  ignore0 = true;
235
231
  } else {
236
- result += host[index].toString(16);
232
+ result += numberToString(host[index], 16);
237
233
  if (index < 7) result += ':';
238
234
  }
239
235
  }
@@ -257,6 +253,7 @@ var percentEncode = function (chr, set) {
257
253
  return code > 0x20 && code < 0x7F && !hasOwn(set, chr) ? chr : encodeURIComponent(chr);
258
254
  };
259
255
 
256
+ // https://url.spec.whatwg.org/#special-scheme
260
257
  var specialSchemes = {
261
258
  ftp: 21,
262
259
  file: null,
@@ -266,46 +263,30 @@ var specialSchemes = {
266
263
  wss: 443
267
264
  };
268
265
 
269
- var isSpecial = function (url) {
270
- return hasOwn(specialSchemes, url.scheme);
271
- };
272
-
273
- var includesCredentials = function (url) {
274
- return url.username != '' || url.password != '';
275
- };
276
-
277
- var cannotHaveUsernamePasswordPort = function (url) {
278
- return !url.host || url.cannotBeABaseURL || url.scheme == 'file';
279
- };
280
-
266
+ // https://url.spec.whatwg.org/#windows-drive-letter
281
267
  var isWindowsDriveLetter = function (string, normalized) {
282
268
  var second;
283
- return string.length == 2 && ALPHA.test(string.charAt(0))
284
- && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));
269
+ return string.length == 2 && exec(ALPHA, charAt(string, 0))
270
+ && ((second = charAt(string, 1)) == ':' || (!normalized && second == '|'));
285
271
  };
286
272
 
273
+ // https://url.spec.whatwg.org/#start-with-a-windows-drive-letter
287
274
  var startsWithWindowsDriveLetter = function (string) {
288
275
  var third;
289
- return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (
276
+ return string.length > 1 && isWindowsDriveLetter(stringSlice(string, 0, 2)) && (
290
277
  string.length == 2 ||
291
- ((third = string.charAt(2)) === '/' || third === '\\' || third === '?' || third === '#')
278
+ ((third = charAt(string, 2)) === '/' || third === '\\' || third === '?' || third === '#')
292
279
  );
293
280
  };
294
281
 
295
- var shortenURLsPath = function (url) {
296
- var path = url.path;
297
- var pathSize = path.length;
298
- if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
299
- path.pop();
300
- }
301
- };
302
-
282
+ // https://url.spec.whatwg.org/#single-dot-path-segment
303
283
  var isSingleDot = function (segment) {
304
- return segment === '.' || segment.toLowerCase() === '%2e';
284
+ return segment === '.' || toLowerCase(segment) === '%2e';
305
285
  };
306
286
 
287
+ // https://url.spec.whatwg.org/#double-dot-path-segment
307
288
  var isDoubleDot = function (segment) {
308
- segment = segment.toLowerCase();
289
+ segment = toLowerCase(segment);
309
290
  return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';
310
291
  };
311
292
 
@@ -332,655 +313,716 @@ var CANNOT_BE_A_BASE_URL_PATH = {};
332
313
  var QUERY = {};
333
314
  var FRAGMENT = {};
334
315
 
335
- // eslint-disable-next-line max-statements -- TODO
336
- var parseURL = function (url, input, stateOverride, base) {
337
- var state = stateOverride || SCHEME_START;
338
- var pointer = 0;
339
- var buffer = '';
340
- var seenAt = false;
341
- var seenBracket = false;
342
- var seenPasswordToken = false;
343
- var codePoints, chr, bufferCodePoints, failure;
344
-
345
- if (!stateOverride) {
346
- url.scheme = '';
347
- url.username = '';
348
- url.password = '';
349
- url.host = null;
350
- url.port = null;
351
- url.path = [];
352
- url.query = null;
353
- url.fragment = null;
354
- url.cannotBeABaseURL = false;
355
- input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
316
+ var URLState = function (url, isBase, base) {
317
+ var urlString = $toString(url);
318
+ var baseState, failure, searchParams;
319
+ if (isBase) {
320
+ failure = this.parse(urlString);
321
+ if (failure) throw TypeError(failure);
322
+ this.searchParams = null;
323
+ } else {
324
+ if (base !== undefined) baseState = new URLState(base, true);
325
+ failure = this.parse(urlString, null, baseState);
326
+ if (failure) throw TypeError(failure);
327
+ searchParams = getInternalSearchParamsState(new URLSearchParams());
328
+ searchParams.bindURL(this);
329
+ this.searchParams = searchParams;
356
330
  }
331
+ };
357
332
 
358
- input = input.replace(TAB_AND_NEW_LINE, '');
333
+ URLState.prototype = {
334
+ type: 'URL',
335
+ // https://url.spec.whatwg.org/#url-parsing
336
+ // eslint-disable-next-line max-statements -- TODO
337
+ parse: function (input, stateOverride, base) {
338
+ var url = this;
339
+ var state = stateOverride || SCHEME_START;
340
+ var pointer = 0;
341
+ var buffer = '';
342
+ var seenAt = false;
343
+ var seenBracket = false;
344
+ var seenPasswordToken = false;
345
+ var codePoints, chr, bufferCodePoints, failure;
346
+
347
+ input = $toString(input);
348
+
349
+ if (!stateOverride) {
350
+ url.scheme = '';
351
+ url.username = '';
352
+ url.password = '';
353
+ url.host = null;
354
+ url.port = null;
355
+ url.path = [];
356
+ url.query = null;
357
+ url.fragment = null;
358
+ url.cannotBeABaseURL = false;
359
+ input = replace(input, LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');
360
+ }
359
361
 
360
- codePoints = arrayFrom(input);
362
+ input = replace(input, TAB_AND_NEW_LINE, '');
361
363
 
362
- while (pointer <= codePoints.length) {
363
- chr = codePoints[pointer];
364
- switch (state) {
365
- case SCHEME_START:
366
- if (chr && ALPHA.test(chr)) {
367
- buffer += chr.toLowerCase();
368
- state = SCHEME;
369
- } else if (!stateOverride) {
370
- state = NO_SCHEME;
371
- continue;
372
- } else return INVALID_SCHEME;
373
- break;
374
-
375
- case SCHEME:
376
- if (chr && (ALPHANUMERIC.test(chr) || chr == '+' || chr == '-' || chr == '.')) {
377
- buffer += chr.toLowerCase();
378
- } else if (chr == ':') {
379
- if (stateOverride && (
380
- (isSpecial(url) != hasOwn(specialSchemes, buffer)) ||
381
- (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||
382
- (url.scheme == 'file' && !url.host)
383
- )) return;
384
- url.scheme = buffer;
385
- if (stateOverride) {
386
- if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;
387
- return;
388
- }
389
- buffer = '';
390
- if (url.scheme == 'file') {
391
- state = FILE;
392
- } else if (isSpecial(url) && base && base.scheme == url.scheme) {
393
- state = SPECIAL_RELATIVE_OR_AUTHORITY;
394
- } else if (isSpecial(url)) {
395
- state = SPECIAL_AUTHORITY_SLASHES;
396
- } else if (codePoints[pointer + 1] == '/') {
397
- state = PATH_OR_AUTHORITY;
398
- pointer++;
399
- } else {
400
- url.cannotBeABaseURL = true;
401
- url.path.push('');
402
- state = CANNOT_BE_A_BASE_URL_PATH;
403
- }
404
- } else if (!stateOverride) {
405
- buffer = '';
406
- state = NO_SCHEME;
407
- pointer = 0;
408
- continue;
409
- } else return INVALID_SCHEME;
410
- break;
364
+ codePoints = arrayFrom(input);
411
365
 
412
- case NO_SCHEME:
413
- if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;
414
- if (base.cannotBeABaseURL && chr == '#') {
415
- url.scheme = base.scheme;
416
- url.path = base.path.slice();
417
- url.query = base.query;
418
- url.fragment = '';
419
- url.cannotBeABaseURL = true;
420
- state = FRAGMENT;
366
+ while (pointer <= codePoints.length) {
367
+ chr = codePoints[pointer];
368
+ switch (state) {
369
+ case SCHEME_START:
370
+ if (chr && exec(ALPHA, chr)) {
371
+ buffer += toLowerCase(chr);
372
+ state = SCHEME;
373
+ } else if (!stateOverride) {
374
+ state = NO_SCHEME;
375
+ continue;
376
+ } else return INVALID_SCHEME;
421
377
  break;
422
- }
423
- state = base.scheme == 'file' ? FILE : RELATIVE;
424
- continue;
425
-
426
- case SPECIAL_RELATIVE_OR_AUTHORITY:
427
- if (chr == '/' && codePoints[pointer + 1] == '/') {
428
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
429
- pointer++;
430
- } else {
431
- state = RELATIVE;
432
- continue;
433
- } break;
434
378
 
435
- case PATH_OR_AUTHORITY:
436
- if (chr == '/') {
437
- state = AUTHORITY;
379
+ case SCHEME:
380
+ if (chr && (exec(ALPHANUMERIC, chr) || chr == '+' || chr == '-' || chr == '.')) {
381
+ buffer += toLowerCase(chr);
382
+ } else if (chr == ':') {
383
+ if (stateOverride && (
384
+ (url.isSpecial() != hasOwn(specialSchemes, buffer)) ||
385
+ (buffer == 'file' && (url.includesCredentials() || url.port !== null)) ||
386
+ (url.scheme == 'file' && !url.host)
387
+ )) return;
388
+ url.scheme = buffer;
389
+ if (stateOverride) {
390
+ if (url.isSpecial() && specialSchemes[url.scheme] == url.port) url.port = null;
391
+ return;
392
+ }
393
+ buffer = '';
394
+ if (url.scheme == 'file') {
395
+ state = FILE;
396
+ } else if (url.isSpecial() && base && base.scheme == url.scheme) {
397
+ state = SPECIAL_RELATIVE_OR_AUTHORITY;
398
+ } else if (url.isSpecial()) {
399
+ state = SPECIAL_AUTHORITY_SLASHES;
400
+ } else if (codePoints[pointer + 1] == '/') {
401
+ state = PATH_OR_AUTHORITY;
402
+ pointer++;
403
+ } else {
404
+ url.cannotBeABaseURL = true;
405
+ push(url.path, '');
406
+ state = CANNOT_BE_A_BASE_URL_PATH;
407
+ }
408
+ } else if (!stateOverride) {
409
+ buffer = '';
410
+ state = NO_SCHEME;
411
+ pointer = 0;
412
+ continue;
413
+ } else return INVALID_SCHEME;
438
414
  break;
439
- } else {
440
- state = PATH;
441
- continue;
442
- }
443
-
444
- case RELATIVE:
445
- url.scheme = base.scheme;
446
- if (chr == EOF) {
447
- url.username = base.username;
448
- url.password = base.password;
449
- url.host = base.host;
450
- url.port = base.port;
451
- url.path = base.path.slice();
452
- url.query = base.query;
453
- } else if (chr == '/' || (chr == '\\' && isSpecial(url))) {
454
- state = RELATIVE_SLASH;
455
- } else if (chr == '?') {
456
- url.username = base.username;
457
- url.password = base.password;
458
- url.host = base.host;
459
- url.port = base.port;
460
- url.path = base.path.slice();
461
- url.query = '';
462
- state = QUERY;
463
- } else if (chr == '#') {
464
- url.username = base.username;
465
- url.password = base.password;
466
- url.host = base.host;
467
- url.port = base.port;
468
- url.path = base.path.slice();
469
- url.query = base.query;
470
- url.fragment = '';
471
- state = FRAGMENT;
472
- } else {
473
- url.username = base.username;
474
- url.password = base.password;
475
- url.host = base.host;
476
- url.port = base.port;
477
- url.path = base.path.slice();
478
- url.path.pop();
479
- state = PATH;
480
- continue;
481
- } break;
482
415
 
483
- case RELATIVE_SLASH:
484
- if (isSpecial(url) && (chr == '/' || chr == '\\')) {
485
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
486
- } else if (chr == '/') {
487
- state = AUTHORITY;
488
- } else {
489
- url.username = base.username;
490
- url.password = base.password;
491
- url.host = base.host;
492
- url.port = base.port;
493
- state = PATH;
416
+ case NO_SCHEME:
417
+ if (!base || (base.cannotBeABaseURL && chr != '#')) return INVALID_SCHEME;
418
+ if (base.cannotBeABaseURL && chr == '#') {
419
+ url.scheme = base.scheme;
420
+ url.path = arraySlice(base.path);
421
+ url.query = base.query;
422
+ url.fragment = '';
423
+ url.cannotBeABaseURL = true;
424
+ state = FRAGMENT;
425
+ break;
426
+ }
427
+ state = base.scheme == 'file' ? FILE : RELATIVE;
494
428
  continue;
495
- } break;
496
429
 
497
- case SPECIAL_AUTHORITY_SLASHES:
498
- state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
499
- if (chr != '/' || buffer.charAt(pointer + 1) != '/') continue;
500
- pointer++;
501
- break;
430
+ case SPECIAL_RELATIVE_OR_AUTHORITY:
431
+ if (chr == '/' && codePoints[pointer + 1] == '/') {
432
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
433
+ pointer++;
434
+ } else {
435
+ state = RELATIVE;
436
+ continue;
437
+ } break;
502
438
 
503
- case SPECIAL_AUTHORITY_IGNORE_SLASHES:
504
- if (chr != '/' && chr != '\\') {
505
- state = AUTHORITY;
506
- continue;
507
- } break;
508
-
509
- case AUTHORITY:
510
- if (chr == '@') {
511
- if (seenAt) buffer = '%40' + buffer;
512
- seenAt = true;
513
- bufferCodePoints = arrayFrom(buffer);
514
- for (var i = 0; i < bufferCodePoints.length; i++) {
515
- var codePoint = bufferCodePoints[i];
516
- if (codePoint == ':' && !seenPasswordToken) {
517
- seenPasswordToken = true;
518
- continue;
519
- }
520
- var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
521
- if (seenPasswordToken) url.password += encodedCodePoints;
522
- else url.username += encodedCodePoints;
523
- }
524
- buffer = '';
525
- } else if (
526
- chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
527
- (chr == '\\' && isSpecial(url))
528
- ) {
529
- if (seenAt && buffer == '') return INVALID_AUTHORITY;
530
- pointer -= arrayFrom(buffer).length + 1;
531
- buffer = '';
532
- state = HOST;
533
- } else buffer += chr;
534
- break;
535
-
536
- case HOST:
537
- case HOSTNAME:
538
- if (stateOverride && url.scheme == 'file') {
539
- state = FILE_HOST;
540
- continue;
541
- } else if (chr == ':' && !seenBracket) {
542
- if (buffer == '') return INVALID_HOST;
543
- failure = parseHost(url, buffer);
544
- if (failure) return failure;
545
- buffer = '';
546
- state = PORT;
547
- if (stateOverride == HOSTNAME) return;
548
- } else if (
549
- chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
550
- (chr == '\\' && isSpecial(url))
551
- ) {
552
- if (isSpecial(url) && buffer == '') return INVALID_HOST;
553
- if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;
554
- failure = parseHost(url, buffer);
555
- if (failure) return failure;
556
- buffer = '';
557
- state = PATH_START;
558
- if (stateOverride) return;
559
- continue;
560
- } else {
561
- if (chr == '[') seenBracket = true;
562
- else if (chr == ']') seenBracket = false;
563
- buffer += chr;
564
- } break;
565
-
566
- case PORT:
567
- if (DIGIT.test(chr)) {
568
- buffer += chr;
569
- } else if (
570
- chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
571
- (chr == '\\' && isSpecial(url)) ||
572
- stateOverride
573
- ) {
574
- if (buffer != '') {
575
- var port = parseInt(buffer, 10);
576
- if (port > 0xFFFF) return INVALID_PORT;
577
- url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;
578
- buffer = '';
439
+ case PATH_OR_AUTHORITY:
440
+ if (chr == '/') {
441
+ state = AUTHORITY;
442
+ break;
443
+ } else {
444
+ state = PATH;
445
+ continue;
579
446
  }
580
- if (stateOverride) return;
581
- state = PATH_START;
582
- continue;
583
- } else return INVALID_PORT;
584
- break;
585
447
 
586
- case FILE:
587
- url.scheme = 'file';
588
- if (chr == '/' || chr == '\\') state = FILE_SLASH;
589
- else if (base && base.scheme == 'file') {
448
+ case RELATIVE:
449
+ url.scheme = base.scheme;
590
450
  if (chr == EOF) {
451
+ url.username = base.username;
452
+ url.password = base.password;
591
453
  url.host = base.host;
592
- url.path = base.path.slice();
454
+ url.port = base.port;
455
+ url.path = arraySlice(base.path);
593
456
  url.query = base.query;
457
+ } else if (chr == '/' || (chr == '\\' && url.isSpecial())) {
458
+ state = RELATIVE_SLASH;
594
459
  } else if (chr == '?') {
460
+ url.username = base.username;
461
+ url.password = base.password;
595
462
  url.host = base.host;
596
- url.path = base.path.slice();
463
+ url.port = base.port;
464
+ url.path = arraySlice(base.path);
597
465
  url.query = '';
598
466
  state = QUERY;
599
467
  } else if (chr == '#') {
468
+ url.username = base.username;
469
+ url.password = base.password;
600
470
  url.host = base.host;
601
- url.path = base.path.slice();
471
+ url.port = base.port;
472
+ url.path = arraySlice(base.path);
602
473
  url.query = base.query;
603
474
  url.fragment = '';
604
475
  state = FRAGMENT;
605
476
  } else {
606
- if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
477
+ url.username = base.username;
478
+ url.password = base.password;
479
+ url.host = base.host;
480
+ url.port = base.port;
481
+ url.path = arraySlice(base.path);
482
+ url.path.length--;
483
+ state = PATH;
484
+ continue;
485
+ } break;
486
+
487
+ case RELATIVE_SLASH:
488
+ if (url.isSpecial() && (chr == '/' || chr == '\\')) {
489
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
490
+ } else if (chr == '/') {
491
+ state = AUTHORITY;
492
+ } else {
493
+ url.username = base.username;
494
+ url.password = base.password;
495
+ url.host = base.host;
496
+ url.port = base.port;
497
+ state = PATH;
498
+ continue;
499
+ } break;
500
+
501
+ case SPECIAL_AUTHORITY_SLASHES:
502
+ state = SPECIAL_AUTHORITY_IGNORE_SLASHES;
503
+ if (chr != '/' || charAt(buffer, pointer + 1) != '/') continue;
504
+ pointer++;
505
+ break;
506
+
507
+ case SPECIAL_AUTHORITY_IGNORE_SLASHES:
508
+ if (chr != '/' && chr != '\\') {
509
+ state = AUTHORITY;
510
+ continue;
511
+ } break;
512
+
513
+ case AUTHORITY:
514
+ if (chr == '@') {
515
+ if (seenAt) buffer = '%40' + buffer;
516
+ seenAt = true;
517
+ bufferCodePoints = arrayFrom(buffer);
518
+ for (var i = 0; i < bufferCodePoints.length; i++) {
519
+ var codePoint = bufferCodePoints[i];
520
+ if (codePoint == ':' && !seenPasswordToken) {
521
+ seenPasswordToken = true;
522
+ continue;
523
+ }
524
+ var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);
525
+ if (seenPasswordToken) url.password += encodedCodePoints;
526
+ else url.username += encodedCodePoints;
527
+ }
528
+ buffer = '';
529
+ } else if (
530
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
531
+ (chr == '\\' && url.isSpecial())
532
+ ) {
533
+ if (seenAt && buffer == '') return INVALID_AUTHORITY;
534
+ pointer -= arrayFrom(buffer).length + 1;
535
+ buffer = '';
536
+ state = HOST;
537
+ } else buffer += chr;
538
+ break;
539
+
540
+ case HOST:
541
+ case HOSTNAME:
542
+ if (stateOverride && url.scheme == 'file') {
543
+ state = FILE_HOST;
544
+ continue;
545
+ } else if (chr == ':' && !seenBracket) {
546
+ if (buffer == '') return INVALID_HOST;
547
+ failure = url.parseHost(buffer);
548
+ if (failure) return failure;
549
+ buffer = '';
550
+ state = PORT;
551
+ if (stateOverride == HOSTNAME) return;
552
+ } else if (
553
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
554
+ (chr == '\\' && url.isSpecial())
555
+ ) {
556
+ if (url.isSpecial() && buffer == '') return INVALID_HOST;
557
+ if (stateOverride && buffer == '' && (url.includesCredentials() || url.port !== null)) return;
558
+ failure = url.parseHost(buffer);
559
+ if (failure) return failure;
560
+ buffer = '';
561
+ state = PATH_START;
562
+ if (stateOverride) return;
563
+ continue;
564
+ } else {
565
+ if (chr == '[') seenBracket = true;
566
+ else if (chr == ']') seenBracket = false;
567
+ buffer += chr;
568
+ } break;
569
+
570
+ case PORT:
571
+ if (exec(DIGIT, chr)) {
572
+ buffer += chr;
573
+ } else if (
574
+ chr == EOF || chr == '/' || chr == '?' || chr == '#' ||
575
+ (chr == '\\' && url.isSpecial()) ||
576
+ stateOverride
577
+ ) {
578
+ if (buffer != '') {
579
+ var port = parseInt(buffer, 10);
580
+ if (port > 0xFFFF) return INVALID_PORT;
581
+ url.port = (url.isSpecial() && port === specialSchemes[url.scheme]) ? null : port;
582
+ buffer = '';
583
+ }
584
+ if (stateOverride) return;
585
+ state = PATH_START;
586
+ continue;
587
+ } else return INVALID_PORT;
588
+ break;
589
+
590
+ case FILE:
591
+ url.scheme = 'file';
592
+ if (chr == '/' || chr == '\\') state = FILE_SLASH;
593
+ else if (base && base.scheme == 'file') {
594
+ if (chr == EOF) {
595
+ url.host = base.host;
596
+ url.path = arraySlice(base.path);
597
+ url.query = base.query;
598
+ } else if (chr == '?') {
607
599
  url.host = base.host;
608
- url.path = base.path.slice();
609
- shortenURLsPath(url);
600
+ url.path = arraySlice(base.path);
601
+ url.query = '';
602
+ state = QUERY;
603
+ } else if (chr == '#') {
604
+ url.host = base.host;
605
+ url.path = arraySlice(base.path);
606
+ url.query = base.query;
607
+ url.fragment = '';
608
+ state = FRAGMENT;
609
+ } else {
610
+ if (!startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
611
+ url.host = base.host;
612
+ url.path = arraySlice(base.path);
613
+ url.shortenPath();
614
+ }
615
+ state = PATH;
616
+ continue;
610
617
  }
618
+ } else {
611
619
  state = PATH;
612
620
  continue;
621
+ } break;
622
+
623
+ case FILE_SLASH:
624
+ if (chr == '/' || chr == '\\') {
625
+ state = FILE_HOST;
626
+ break;
627
+ }
628
+ if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(join(arraySlice(codePoints, pointer), ''))) {
629
+ if (isWindowsDriveLetter(base.path[0], true)) push(url.path, base.path[0]);
630
+ else url.host = base.host;
613
631
  }
614
- } else {
615
632
  state = PATH;
616
633
  continue;
617
- } break;
618
634
 
619
- case FILE_SLASH:
620
- if (chr == '/' || chr == '\\') {
621
- state = FILE_HOST;
635
+ case FILE_HOST:
636
+ if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') {
637
+ if (!stateOverride && isWindowsDriveLetter(buffer)) {
638
+ state = PATH;
639
+ } else if (buffer == '') {
640
+ url.host = '';
641
+ if (stateOverride) return;
642
+ state = PATH_START;
643
+ } else {
644
+ failure = url.parseHost(buffer);
645
+ if (failure) return failure;
646
+ if (url.host == 'localhost') url.host = '';
647
+ if (stateOverride) return;
648
+ buffer = '';
649
+ state = PATH_START;
650
+ } continue;
651
+ } else buffer += chr;
622
652
  break;
623
- }
624
- if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {
625
- if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);
626
- else url.host = base.host;
627
- }
628
- state = PATH;
629
- continue;
630
653
 
631
- case FILE_HOST:
632
- if (chr == EOF || chr == '/' || chr == '\\' || chr == '?' || chr == '#') {
633
- if (!stateOverride && isWindowsDriveLetter(buffer)) {
654
+ case PATH_START:
655
+ if (url.isSpecial()) {
634
656
  state = PATH;
635
- } else if (buffer == '') {
636
- url.host = '';
637
- if (stateOverride) return;
638
- state = PATH_START;
639
- } else {
640
- failure = parseHost(url, buffer);
641
- if (failure) return failure;
642
- if (url.host == 'localhost') url.host = '';
643
- if (stateOverride) return;
657
+ if (chr != '/' && chr != '\\') continue;
658
+ } else if (!stateOverride && chr == '?') {
659
+ url.query = '';
660
+ state = QUERY;
661
+ } else if (!stateOverride && chr == '#') {
662
+ url.fragment = '';
663
+ state = FRAGMENT;
664
+ } else if (chr != EOF) {
665
+ state = PATH;
666
+ if (chr != '/') continue;
667
+ } break;
668
+
669
+ case PATH:
670
+ if (
671
+ chr == EOF || chr == '/' ||
672
+ (chr == '\\' && url.isSpecial()) ||
673
+ (!stateOverride && (chr == '?' || chr == '#'))
674
+ ) {
675
+ if (isDoubleDot(buffer)) {
676
+ url.shortenPath();
677
+ if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
678
+ push(url.path, '');
679
+ }
680
+ } else if (isSingleDot(buffer)) {
681
+ if (chr != '/' && !(chr == '\\' && url.isSpecial())) {
682
+ push(url.path, '');
683
+ }
684
+ } else {
685
+ if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
686
+ if (url.host) url.host = '';
687
+ buffer = charAt(buffer, 0) + ':'; // normalize windows drive letter
688
+ }
689
+ push(url.path, buffer);
690
+ }
644
691
  buffer = '';
645
- state = PATH_START;
646
- } continue;
647
- } else buffer += chr;
648
- break;
649
-
650
- case PATH_START:
651
- if (isSpecial(url)) {
652
- state = PATH;
653
- if (chr != '/' && chr != '\\') continue;
654
- } else if (!stateOverride && chr == '?') {
655
- url.query = '';
656
- state = QUERY;
657
- } else if (!stateOverride && chr == '#') {
658
- url.fragment = '';
659
- state = FRAGMENT;
660
- } else if (chr != EOF) {
661
- state = PATH;
662
- if (chr != '/') continue;
663
- } break;
664
-
665
- case PATH:
666
- if (
667
- chr == EOF || chr == '/' ||
668
- (chr == '\\' && isSpecial(url)) ||
669
- (!stateOverride && (chr == '?' || chr == '#'))
670
- ) {
671
- if (isDoubleDot(buffer)) {
672
- shortenURLsPath(url);
673
- if (chr != '/' && !(chr == '\\' && isSpecial(url))) {
674
- url.path.push('');
692
+ if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
693
+ while (url.path.length > 1 && url.path[0] === '') {
694
+ shift(url.path);
695
+ }
675
696
  }
676
- } else if (isSingleDot(buffer)) {
677
- if (chr != '/' && !(chr == '\\' && isSpecial(url))) {
678
- url.path.push('');
697
+ if (chr == '?') {
698
+ url.query = '';
699
+ state = QUERY;
700
+ } else if (chr == '#') {
701
+ url.fragment = '';
702
+ state = FRAGMENT;
679
703
  }
680
704
  } else {
681
- if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {
682
- if (url.host) url.host = '';
683
- buffer = buffer.charAt(0) + ':'; // normalize windows drive letter
684
- }
685
- url.path.push(buffer);
686
- }
687
- buffer = '';
688
- if (url.scheme == 'file' && (chr == EOF || chr == '?' || chr == '#')) {
689
- while (url.path.length > 1 && url.path[0] === '') {
690
- url.path.shift();
691
- }
692
- }
705
+ buffer += percentEncode(chr, pathPercentEncodeSet);
706
+ } break;
707
+
708
+ case CANNOT_BE_A_BASE_URL_PATH:
693
709
  if (chr == '?') {
694
710
  url.query = '';
695
711
  state = QUERY;
696
712
  } else if (chr == '#') {
697
713
  url.fragment = '';
698
714
  state = FRAGMENT;
699
- }
700
- } else {
701
- buffer += percentEncode(chr, pathPercentEncodeSet);
702
- } break;
703
-
704
- case CANNOT_BE_A_BASE_URL_PATH:
705
- if (chr == '?') {
706
- url.query = '';
707
- state = QUERY;
708
- } else if (chr == '#') {
709
- url.fragment = '';
710
- state = FRAGMENT;
711
- } else if (chr != EOF) {
712
- url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
713
- } break;
714
-
715
- case QUERY:
716
- if (!stateOverride && chr == '#') {
717
- url.fragment = '';
718
- state = FRAGMENT;
719
- } else if (chr != EOF) {
720
- if (chr == "'" && isSpecial(url)) url.query += '%27';
721
- else if (chr == '#') url.query += '%23';
722
- else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
723
- } break;
724
-
725
- case FRAGMENT:
726
- if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
727
- break;
728
- }
715
+ } else if (chr != EOF) {
716
+ url.path[0] += percentEncode(chr, C0ControlPercentEncodeSet);
717
+ } break;
718
+
719
+ case QUERY:
720
+ if (!stateOverride && chr == '#') {
721
+ url.fragment = '';
722
+ state = FRAGMENT;
723
+ } else if (chr != EOF) {
724
+ if (chr == "'" && url.isSpecial()) url.query += '%27';
725
+ else if (chr == '#') url.query += '%23';
726
+ else url.query += percentEncode(chr, C0ControlPercentEncodeSet);
727
+ } break;
728
+
729
+ case FRAGMENT:
730
+ if (chr != EOF) url.fragment += percentEncode(chr, fragmentPercentEncodeSet);
731
+ break;
732
+ }
729
733
 
730
- pointer++;
734
+ pointer++;
735
+ }
736
+ },
737
+ // https://url.spec.whatwg.org/#host-parsing
738
+ parseHost: function (input) {
739
+ var result, codePoints, index;
740
+ if (charAt(input, 0) == '[') {
741
+ if (charAt(input, input.length - 1) != ']') return INVALID_HOST;
742
+ result = parseIPv6(stringSlice(input, 1, -1));
743
+ if (!result) return INVALID_HOST;
744
+ this.host = result;
745
+ // opaque host
746
+ } else if (!this.isSpecial()) {
747
+ if (exec(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT, input)) return INVALID_HOST;
748
+ result = '';
749
+ codePoints = arrayFrom(input);
750
+ for (index = 0; index < codePoints.length; index++) {
751
+ result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);
752
+ }
753
+ this.host = result;
754
+ } else {
755
+ input = toASCII(input);
756
+ if (exec(FORBIDDEN_HOST_CODE_POINT, input)) return INVALID_HOST;
757
+ result = parseIPv4(input);
758
+ if (result === null) return INVALID_HOST;
759
+ this.host = result;
760
+ }
761
+ },
762
+ // https://url.spec.whatwg.org/#cannot-have-a-username-password-port
763
+ cannotHaveUsernamePasswordPort: function () {
764
+ return !this.host || this.cannotBeABaseURL || this.scheme == 'file';
765
+ },
766
+ // https://url.spec.whatwg.org/#include-credentials
767
+ includesCredentials: function () {
768
+ return this.username != '' || this.password != '';
769
+ },
770
+ // https://url.spec.whatwg.org/#is-special
771
+ isSpecial: function () {
772
+ return hasOwn(specialSchemes, this.scheme);
773
+ },
774
+ // https://url.spec.whatwg.org/#shorten-a-urls-path
775
+ shortenPath: function () {
776
+ var path = this.path;
777
+ var pathSize = path.length;
778
+ if (pathSize && (this.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {
779
+ path.length--;
780
+ }
781
+ },
782
+ // https://url.spec.whatwg.org/#concept-url-serializer
783
+ serialize: function () {
784
+ var url = this;
785
+ var scheme = url.scheme;
786
+ var username = url.username;
787
+ var password = url.password;
788
+ var host = url.host;
789
+ var port = url.port;
790
+ var path = url.path;
791
+ var query = url.query;
792
+ var fragment = url.fragment;
793
+ var output = scheme + ':';
794
+ if (host !== null) {
795
+ output += '//';
796
+ if (url.includesCredentials()) {
797
+ output += username + (password ? ':' + password : '') + '@';
798
+ }
799
+ output += serializeHost(host);
800
+ if (port !== null) output += ':' + port;
801
+ } else if (scheme == 'file') output += '//';
802
+ output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
803
+ if (query !== null) output += '?' + query;
804
+ if (fragment !== null) output += '#' + fragment;
805
+ return output;
806
+ },
807
+ // https://url.spec.whatwg.org/#dom-url-href
808
+ setHref: function (href) {
809
+ var failure = this.parse(href);
810
+ if (failure) throw TypeError(failure);
811
+ this.searchParams.update();
812
+ },
813
+ // https://url.spec.whatwg.org/#dom-url-origin
814
+ getOrigin: function () {
815
+ var scheme = this.scheme;
816
+ var port = this.port;
817
+ if (scheme == 'blob') try {
818
+ return new URLConstructor(scheme.path[0]).origin;
819
+ } catch (error) {
820
+ return 'null';
821
+ }
822
+ if (scheme == 'file' || !this.isSpecial()) return 'null';
823
+ return scheme + '://' + serializeHost(this.host) + (port !== null ? ':' + port : '');
824
+ },
825
+ // https://url.spec.whatwg.org/#dom-url-protocol
826
+ getProtocol: function () {
827
+ return this.scheme + ':';
828
+ },
829
+ setProtocol: function (protocol) {
830
+ this.parse($toString(protocol) + ':', SCHEME_START);
831
+ },
832
+ // https://url.spec.whatwg.org/#dom-url-username
833
+ getUsername: function () {
834
+ return this.username;
835
+ },
836
+ setUsername: function (username) {
837
+ var codePoints = arrayFrom($toString(username));
838
+ if (this.cannotHaveUsernamePasswordPort()) return;
839
+ this.username = '';
840
+ for (var i = 0; i < codePoints.length; i++) {
841
+ this.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
842
+ }
843
+ },
844
+ // https://url.spec.whatwg.org/#dom-url-password
845
+ getPassword: function () {
846
+ return this.password;
847
+ },
848
+ setPassword: function (password) {
849
+ var codePoints = arrayFrom($toString(password));
850
+ if (this.cannotHaveUsernamePasswordPort()) return;
851
+ this.password = '';
852
+ for (var i = 0; i < codePoints.length; i++) {
853
+ this.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
854
+ }
855
+ },
856
+ // https://url.spec.whatwg.org/#dom-url-host
857
+ getHost: function () {
858
+ var host = this.host;
859
+ var port = this.port;
860
+ return host === null ? ''
861
+ : port === null ? serializeHost(host)
862
+ : serializeHost(host) + ':' + port;
863
+ },
864
+ setHost: function (host) {
865
+ if (this.cannotBeABaseURL) return;
866
+ this.parse(host, HOST);
867
+ },
868
+ // https://url.spec.whatwg.org/#dom-url-hostname
869
+ getHostname: function () {
870
+ var host = this.host;
871
+ return host === null ? '' : serializeHost(host);
872
+ },
873
+ setHostname: function (hostname) {
874
+ if (this.cannotBeABaseURL) return;
875
+ this.parse(hostname, HOSTNAME);
876
+ },
877
+ // https://url.spec.whatwg.org/#dom-url-port
878
+ getPort: function () {
879
+ var port = this.port;
880
+ return port === null ? '' : $toString(port);
881
+ },
882
+ setPort: function (port) {
883
+ if (this.cannotHaveUsernamePasswordPort()) return;
884
+ port = $toString(port);
885
+ if (port == '') this.port = null;
886
+ else this.parse(port, PORT);
887
+ },
888
+ // https://url.spec.whatwg.org/#dom-url-pathname
889
+ getPathname: function () {
890
+ var path = this.path;
891
+ return this.cannotBeABaseURL ? path[0] : path.length ? '/' + join(path, '/') : '';
892
+ },
893
+ setPathname: function (pathname) {
894
+ if (this.cannotBeABaseURL) return;
895
+ this.path = [];
896
+ this.parse(pathname, PATH_START);
897
+ },
898
+ // https://url.spec.whatwg.org/#dom-url-search
899
+ getSearch: function () {
900
+ var query = this.query;
901
+ return query ? '?' + query : '';
902
+ },
903
+ setSearch: function (search) {
904
+ search = $toString(search);
905
+ if (search == '') {
906
+ this.query = null;
907
+ } else {
908
+ if ('?' == charAt(search, 0)) search = stringSlice(search, 1);
909
+ this.query = '';
910
+ this.parse(search, QUERY);
911
+ }
912
+ this.searchParams.update();
913
+ },
914
+ // https://url.spec.whatwg.org/#dom-url-searchparams
915
+ getSearchParams: function () {
916
+ return this.searchParams.facade;
917
+ },
918
+ // https://url.spec.whatwg.org/#dom-url-hash
919
+ getHash: function () {
920
+ var fragment = this.fragment;
921
+ return fragment ? '#' + fragment : '';
922
+ },
923
+ setHash: function (hash) {
924
+ hash = $toString(hash);
925
+ if (hash == '') {
926
+ this.fragment = null;
927
+ return;
928
+ }
929
+ if ('#' == charAt(hash, 0)) hash = stringSlice(hash, 1);
930
+ this.fragment = '';
931
+ this.parse(hash, FRAGMENT);
932
+ },
933
+ update: function () {
934
+ this.query = this.searchParams.serialize() || null;
731
935
  }
732
936
  };
733
937
 
734
938
  // `URL` constructor
735
939
  // https://url.spec.whatwg.org/#url-class
736
940
  var URLConstructor = function URL(url /* , base */) {
737
- var that = anInstance(this, URLConstructor, 'URL');
941
+ var that = anInstance(this, URLPrototype);
738
942
  var base = arguments.length > 1 ? arguments[1] : undefined;
739
- var urlString = $toString(url);
740
- var state = setInternalState(that, { type: 'URL' });
741
- var baseState, failure;
742
- if (base !== undefined) {
743
- if (base instanceof URLConstructor) baseState = getInternalURLState(base);
744
- else {
745
- failure = parseURL(baseState = {}, $toString(base));
746
- if (failure) throw TypeError(failure);
747
- }
748
- }
749
- failure = parseURL(state, urlString, null, baseState);
750
- if (failure) throw TypeError(failure);
751
- var searchParams = state.searchParams = new URLSearchParams();
752
- var searchParamsState = getInternalSearchParamsState(searchParams);
753
- searchParamsState.updateSearchParams(state.query);
754
- searchParamsState.updateURL = function () {
755
- state.query = String(searchParams) || null;
756
- };
943
+ var state = setInternalState(that, new URLState(url, false, base));
757
944
  if (!DESCRIPTORS) {
758
- that.href = serializeURL.call(that);
759
- that.origin = getOrigin.call(that);
760
- that.protocol = getProtocol.call(that);
761
- that.username = getUsername.call(that);
762
- that.password = getPassword.call(that);
763
- that.host = getHost.call(that);
764
- that.hostname = getHostname.call(that);
765
- that.port = getPort.call(that);
766
- that.pathname = getPathname.call(that);
767
- that.search = getSearch.call(that);
768
- that.searchParams = getSearchParams.call(that);
769
- that.hash = getHash.call(that);
945
+ that.href = state.serialize();
946
+ that.origin = state.getOrigin();
947
+ that.protocol = state.getProtocol();
948
+ that.username = state.getUsername();
949
+ that.password = state.getPassword();
950
+ that.host = state.getHost();
951
+ that.hostname = state.getHostname();
952
+ that.port = state.getPort();
953
+ that.pathname = state.getPathname();
954
+ that.search = state.getSearch();
955
+ that.searchParams = state.getSearchParams();
956
+ that.hash = state.getHash();
770
957
  }
771
958
  };
772
959
 
773
960
  var URLPrototype = URLConstructor.prototype;
774
961
 
775
- var serializeURL = function () {
776
- var url = getInternalURLState(this);
777
- var scheme = url.scheme;
778
- var username = url.username;
779
- var password = url.password;
780
- var host = url.host;
781
- var port = url.port;
782
- var path = url.path;
783
- var query = url.query;
784
- var fragment = url.fragment;
785
- var output = scheme + ':';
786
- if (host !== null) {
787
- output += '//';
788
- if (includesCredentials(url)) {
789
- output += username + (password ? ':' + password : '') + '@';
790
- }
791
- output += serializeHost(host);
792
- if (port !== null) output += ':' + port;
793
- } else if (scheme == 'file') output += '//';
794
- output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
795
- if (query !== null) output += '?' + query;
796
- if (fragment !== null) output += '#' + fragment;
797
- return output;
798
- };
799
-
800
- var getOrigin = function () {
801
- var url = getInternalURLState(this);
802
- var scheme = url.scheme;
803
- var port = url.port;
804
- if (scheme == 'blob') try {
805
- return new URLConstructor(scheme.path[0]).origin;
806
- } catch (error) {
807
- return 'null';
808
- }
809
- if (scheme == 'file' || !isSpecial(url)) return 'null';
810
- return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');
811
- };
812
-
813
- var getProtocol = function () {
814
- return getInternalURLState(this).scheme + ':';
815
- };
816
-
817
- var getUsername = function () {
818
- return getInternalURLState(this).username;
819
- };
820
-
821
- var getPassword = function () {
822
- return getInternalURLState(this).password;
823
- };
824
-
825
- var getHost = function () {
826
- var url = getInternalURLState(this);
827
- var host = url.host;
828
- var port = url.port;
829
- return host === null ? ''
830
- : port === null ? serializeHost(host)
831
- : serializeHost(host) + ':' + port;
832
- };
833
-
834
- var getHostname = function () {
835
- var host = getInternalURLState(this).host;
836
- return host === null ? '' : serializeHost(host);
837
- };
838
-
839
- var getPort = function () {
840
- var port = getInternalURLState(this).port;
841
- return port === null ? '' : String(port);
842
- };
843
-
844
- var getPathname = function () {
845
- var url = getInternalURLState(this);
846
- var path = url.path;
847
- return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';
848
- };
849
-
850
- var getSearch = function () {
851
- var query = getInternalURLState(this).query;
852
- return query ? '?' + query : '';
853
- };
854
-
855
- var getSearchParams = function () {
856
- return getInternalURLState(this).searchParams;
857
- };
858
-
859
- var getHash = function () {
860
- var fragment = getInternalURLState(this).fragment;
861
- return fragment ? '#' + fragment : '';
862
- };
863
-
864
962
  var accessorDescriptor = function (getter, setter) {
865
- return { get: getter, set: setter, configurable: true, enumerable: true };
963
+ return {
964
+ get: function () {
965
+ return getInternalURLState(this)[getter]();
966
+ },
967
+ set: setter && function (value) {
968
+ return getInternalURLState(this)[setter](value);
969
+ },
970
+ configurable: true,
971
+ enumerable: true
972
+ };
866
973
  };
867
974
 
868
975
  if (DESCRIPTORS) {
869
976
  defineProperties(URLPrototype, {
870
977
  // `URL.prototype.href` accessors pair
871
978
  // https://url.spec.whatwg.org/#dom-url-href
872
- href: accessorDescriptor(serializeURL, function (href) {
873
- var url = getInternalURLState(this);
874
- var urlString = $toString(href);
875
- var failure = parseURL(url, urlString);
876
- if (failure) throw TypeError(failure);
877
- getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
878
- }),
979
+ href: accessorDescriptor('serialize', 'setHref'),
879
980
  // `URL.prototype.origin` getter
880
981
  // https://url.spec.whatwg.org/#dom-url-origin
881
- origin: accessorDescriptor(getOrigin),
982
+ origin: accessorDescriptor('getOrigin'),
882
983
  // `URL.prototype.protocol` accessors pair
883
984
  // https://url.spec.whatwg.org/#dom-url-protocol
884
- protocol: accessorDescriptor(getProtocol, function (protocol) {
885
- var url = getInternalURLState(this);
886
- parseURL(url, $toString(protocol) + ':', SCHEME_START);
887
- }),
985
+ protocol: accessorDescriptor('getProtocol', 'setProtocol'),
888
986
  // `URL.prototype.username` accessors pair
889
987
  // https://url.spec.whatwg.org/#dom-url-username
890
- username: accessorDescriptor(getUsername, function (username) {
891
- var url = getInternalURLState(this);
892
- var codePoints = arrayFrom($toString(username));
893
- if (cannotHaveUsernamePasswordPort(url)) return;
894
- url.username = '';
895
- for (var i = 0; i < codePoints.length; i++) {
896
- url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);
897
- }
898
- }),
988
+ username: accessorDescriptor('getUsername', 'setUsername'),
899
989
  // `URL.prototype.password` accessors pair
900
990
  // https://url.spec.whatwg.org/#dom-url-password
901
- password: accessorDescriptor(getPassword, function (password) {
902
- var url = getInternalURLState(this);
903
- var codePoints = arrayFrom($toString(password));
904
- if (cannotHaveUsernamePasswordPort(url)) return;
905
- url.password = '';
906
- for (var i = 0; i < codePoints.length; i++) {
907
- url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);
908
- }
909
- }),
991
+ password: accessorDescriptor('getPassword', 'setPassword'),
910
992
  // `URL.prototype.host` accessors pair
911
993
  // https://url.spec.whatwg.org/#dom-url-host
912
- host: accessorDescriptor(getHost, function (host) {
913
- var url = getInternalURLState(this);
914
- if (url.cannotBeABaseURL) return;
915
- parseURL(url, $toString(host), HOST);
916
- }),
994
+ host: accessorDescriptor('getHost', 'setHost'),
917
995
  // `URL.prototype.hostname` accessors pair
918
996
  // https://url.spec.whatwg.org/#dom-url-hostname
919
- hostname: accessorDescriptor(getHostname, function (hostname) {
920
- var url = getInternalURLState(this);
921
- if (url.cannotBeABaseURL) return;
922
- parseURL(url, $toString(hostname), HOSTNAME);
923
- }),
997
+ hostname: accessorDescriptor('getHostname', 'setHostname'),
924
998
  // `URL.prototype.port` accessors pair
925
999
  // https://url.spec.whatwg.org/#dom-url-port
926
- port: accessorDescriptor(getPort, function (port) {
927
- var url = getInternalURLState(this);
928
- if (cannotHaveUsernamePasswordPort(url)) return;
929
- port = $toString(port);
930
- if (port == '') url.port = null;
931
- else parseURL(url, port, PORT);
932
- }),
1000
+ port: accessorDescriptor('getPort', 'setPort'),
933
1001
  // `URL.prototype.pathname` accessors pair
934
1002
  // https://url.spec.whatwg.org/#dom-url-pathname
935
- pathname: accessorDescriptor(getPathname, function (pathname) {
936
- var url = getInternalURLState(this);
937
- if (url.cannotBeABaseURL) return;
938
- url.path = [];
939
- parseURL(url, $toString(pathname), PATH_START);
940
- }),
1003
+ pathname: accessorDescriptor('getPathname', 'setPathname'),
941
1004
  // `URL.prototype.search` accessors pair
942
1005
  // https://url.spec.whatwg.org/#dom-url-search
943
- search: accessorDescriptor(getSearch, function (search) {
944
- var url = getInternalURLState(this);
945
- search = $toString(search);
946
- if (search == '') {
947
- url.query = null;
948
- } else {
949
- if ('?' == search.charAt(0)) search = search.slice(1);
950
- url.query = '';
951
- parseURL(url, search, QUERY);
952
- }
953
- getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);
954
- }),
1006
+ search: accessorDescriptor('getSearch', 'setSearch'),
955
1007
  // `URL.prototype.searchParams` getter
956
1008
  // https://url.spec.whatwg.org/#dom-url-searchparams
957
- searchParams: accessorDescriptor(getSearchParams),
1009
+ searchParams: accessorDescriptor('getSearchParams'),
958
1010
  // `URL.prototype.hash` accessors pair
959
1011
  // https://url.spec.whatwg.org/#dom-url-hash
960
- hash: accessorDescriptor(getHash, function (hash) {
961
- var url = getInternalURLState(this);
962
- hash = $toString(hash);
963
- if (hash == '') {
964
- url.fragment = null;
965
- return;
966
- }
967
- if ('#' == hash.charAt(0)) hash = hash.slice(1);
968
- url.fragment = '';
969
- parseURL(url, hash, FRAGMENT);
970
- })
1012
+ hash: accessorDescriptor('getHash', 'setHash')
971
1013
  });
972
1014
  }
973
1015
 
974
1016
  // `URL.prototype.toJSON` method
975
1017
  // https://url.spec.whatwg.org/#dom-url-tojson
976
1018
  redefine(URLPrototype, 'toJSON', function toJSON() {
977
- return serializeURL.call(this);
1019
+ return getInternalURLState(this).serialize();
978
1020
  }, { enumerable: true });
979
1021
 
980
1022
  // `URL.prototype.toString` method
981
1023
  // https://url.spec.whatwg.org/#URL-stringification-behavior
982
1024
  redefine(URLPrototype, 'toString', function toString() {
983
- return serializeURL.call(this);
1025
+ return getInternalURLState(this).serialize();
984
1026
  }, { enumerable: true });
985
1027
 
986
1028
  if (NativeURL) {
@@ -988,16 +1030,10 @@ if (NativeURL) {
988
1030
  var nativeRevokeObjectURL = NativeURL.revokeObjectURL;
989
1031
  // `URL.createObjectURL` method
990
1032
  // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL
991
- // eslint-disable-next-line no-unused-vars -- required for `.length`
992
- if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {
993
- return nativeCreateObjectURL.apply(NativeURL, arguments);
994
- });
1033
+ if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', bind(nativeCreateObjectURL, NativeURL));
995
1034
  // `URL.revokeObjectURL` method
996
1035
  // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL
997
- // eslint-disable-next-line no-unused-vars -- required for `.length`
998
- if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {
999
- return nativeRevokeObjectURL.apply(NativeURL, arguments);
1000
- });
1036
+ if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', bind(nativeRevokeObjectURL, NativeURL));
1001
1037
  }
1002
1038
 
1003
1039
  setToStringTag(URLConstructor, 'URL');