@wordpress/dom 4.57.0 → 5.1.0

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/README.md +23 -23
  2. package/build/data-transfer.cjs +20 -38
  3. package/build/data-transfer.cjs.map +1 -7
  4. package/build/dom/caret-range-from-point.cjs +31 -38
  5. package/build/dom/caret-range-from-point.cjs.map +1 -7
  6. package/build/dom/clean-node-list.cjs +88 -133
  7. package/build/dom/clean-node-list.cjs.map +1 -7
  8. package/build/dom/compute-caret-rect.cjs +36 -36
  9. package/build/dom/compute-caret-rect.cjs.map +1 -7
  10. package/build/dom/document-has-selection.cjs +36 -31
  11. package/build/dom/document-has-selection.cjs.map +1 -7
  12. package/build/dom/document-has-text-selection.cjs +24 -30
  13. package/build/dom/document-has-text-selection.cjs.map +1 -7
  14. package/build/dom/document-has-uncollapsed-selection.cjs +35 -30
  15. package/build/dom/document-has-uncollapsed-selection.cjs.map +1 -7
  16. package/build/dom/get-computed-style.cjs +14 -30
  17. package/build/dom/get-computed-style.cjs.map +1 -7
  18. package/build/dom/get-offset-parent.cjs +41 -48
  19. package/build/dom/get-offset-parent.cjs.map +1 -7
  20. package/build/dom/get-range-height.cjs +18 -31
  21. package/build/dom/get-range-height.cjs.map +1 -7
  22. package/build/dom/get-rectangle-from-range.cjs +82 -133
  23. package/build/dom/get-rectangle-from-range.cjs.map +1 -7
  24. package/build/dom/get-scroll-container.cjs +47 -55
  25. package/build/dom/get-scroll-container.cjs.map +1 -7
  26. package/build/dom/hidden-caret-range-from-point.cjs +49 -43
  27. package/build/dom/hidden-caret-range-from-point.cjs.map +1 -7
  28. package/build/dom/index.cjs +233 -110
  29. package/build/dom/input-field-has-uncollapsed-selection.cjs +49 -47
  30. package/build/dom/input-field-has-uncollapsed-selection.cjs.map +1 -7
  31. package/build/dom/insert-after.cjs +17 -27
  32. package/build/dom/insert-after.cjs.map +1 -7
  33. package/build/dom/is-edge.cjs +83 -98
  34. package/build/dom/is-edge.cjs.map +1 -7
  35. package/build/dom/is-element.cjs +12 -25
  36. package/build/dom/is-element.cjs.map +1 -7
  37. package/build/dom/is-empty.cjs +23 -40
  38. package/build/dom/is-empty.cjs.map +1 -7
  39. package/build/dom/is-entirely-selected.cjs +71 -71
  40. package/build/dom/is-entirely-selected.cjs.map +1 -7
  41. package/build/dom/is-form-element.cjs +34 -34
  42. package/build/dom/is-form-element.cjs.map +1 -7
  43. package/build/dom/is-horizontal-edge.cjs +32 -29
  44. package/build/dom/is-horizontal-edge.cjs.map +1 -7
  45. package/build/dom/is-html-input-element.cjs +12 -25
  46. package/build/dom/is-html-input-element.cjs.map +1 -7
  47. package/build/dom/is-input-or-text-area.cjs +12 -25
  48. package/build/dom/is-input-or-text-area.cjs.map +1 -7
  49. package/build/dom/is-number-input.cjs +37 -34
  50. package/build/dom/is-number-input.cjs.map +1 -7
  51. package/build/dom/is-rtl.cjs +31 -29
  52. package/build/dom/is-rtl.cjs.map +1 -7
  53. package/build/dom/is-selection-forward.cjs +26 -39
  54. package/build/dom/is-selection-forward.cjs.map +1 -7
  55. package/build/dom/is-text-field.cjs +46 -44
  56. package/build/dom/is-text-field.cjs.map +1 -7
  57. package/build/dom/is-vertical-edge.cjs +32 -29
  58. package/build/dom/is-vertical-edge.cjs.map +1 -7
  59. package/build/dom/place-caret-at-edge.cjs +76 -79
  60. package/build/dom/place-caret-at-edge.cjs.map +1 -7
  61. package/build/dom/place-caret-at-horizontal-edge.cjs +30 -29
  62. package/build/dom/place-caret-at-horizontal-edge.cjs.map +1 -7
  63. package/build/dom/place-caret-at-vertical-edge.cjs +31 -29
  64. package/build/dom/place-caret-at-vertical-edge.cjs.map +1 -7
  65. package/build/dom/remove-invalid-html.cjs +36 -32
  66. package/build/dom/remove-invalid-html.cjs.map +1 -7
  67. package/build/dom/remove.cjs +15 -27
  68. package/build/dom/remove.cjs.map +1 -7
  69. package/build/dom/replace-tag.cjs +21 -32
  70. package/build/dom/replace-tag.cjs.map +1 -7
  71. package/build/dom/replace.cjs +35 -33
  72. package/build/dom/replace.cjs.map +1 -7
  73. package/build/dom/safe-html.cjs +46 -47
  74. package/build/dom/safe-html.cjs.map +1 -7
  75. package/build/dom/scroll-if-no-range.cjs +24 -37
  76. package/build/dom/scroll-if-no-range.cjs.map +1 -7
  77. package/build/dom/strip-html.cjs +34 -32
  78. package/build/dom/strip-html.cjs.map +1 -7
  79. package/build/dom/types.cjs +5 -0
  80. package/build/dom/unwrap.cjs +17 -31
  81. package/build/dom/unwrap.cjs.map +1 -7
  82. package/build/dom/wrap.cjs +17 -28
  83. package/build/dom/wrap.cjs.map +1 -7
  84. package/build/focusable.cjs +99 -77
  85. package/build/focusable.cjs.map +1 -7
  86. package/build/index.cjs +58 -39
  87. package/build/index.cjs.map +1 -7
  88. package/build/phrasing-content.cjs +163 -159
  89. package/build/phrasing-content.cjs.map +1 -7
  90. package/build/tabbable.cjs +123 -78
  91. package/build/tabbable.cjs.map +1 -7
  92. package/build/types.cjs +5 -0
  93. package/build/utils/assert-is-defined.cjs +8 -33
  94. package/build/utils/assert-is-defined.cjs.map +1 -7
  95. package/build-module/data-transfer.mjs +17 -15
  96. package/build-module/data-transfer.mjs.map +1 -7
  97. package/build-module/dom/caret-range-from-point.mjs +28 -19
  98. package/build-module/dom/caret-range-from-point.mjs.map +1 -7
  99. package/build-module/dom/clean-node-list.mjs +60 -105
  100. package/build-module/dom/clean-node-list.mjs.map +1 -7
  101. package/build-module/dom/compute-caret-rect.mjs +16 -12
  102. package/build-module/dom/compute-caret-rect.mjs.map +1 -7
  103. package/build-module/dom/document-has-selection.mjs +13 -6
  104. package/build-module/dom/document-has-selection.mjs.map +1 -7
  105. package/build-module/dom/document-has-text-selection.mjs +20 -10
  106. package/build-module/dom/document-has-text-selection.mjs.map +1 -7
  107. package/build-module/dom/document-has-uncollapsed-selection.mjs +14 -6
  108. package/build-module/dom/document-has-uncollapsed-selection.mjs.map +1 -7
  109. package/build-module/dom/get-computed-style.mjs +10 -10
  110. package/build-module/dom/get-computed-style.mjs.map +1 -7
  111. package/build-module/dom/get-offset-parent.mjs +21 -25
  112. package/build-module/dom/get-offset-parent.mjs.map +1 -7
  113. package/build-module/dom/get-range-height.mjs +15 -12
  114. package/build-module/dom/get-range-height.mjs.map +1 -7
  115. package/build-module/dom/get-rectangle-from-range.mjs +78 -113
  116. package/build-module/dom/get-rectangle-from-range.mjs.map +1 -7
  117. package/build-module/dom/get-scroll-container.mjs +28 -32
  118. package/build-module/dom/get-scroll-container.mjs.map +1 -7
  119. package/build-module/dom/hidden-caret-range-from-point.mjs +28 -19
  120. package/build-module/dom/hidden-caret-range-from-point.mjs.map +1 -7
  121. package/build-module/dom/index.mjs +28 -58
  122. package/build-module/dom/input-field-has-uncollapsed-selection.mjs +28 -23
  123. package/build-module/dom/input-field-has-uncollapsed-selection.mjs.map +1 -7
  124. package/build-module/dom/insert-after.mjs +13 -7
  125. package/build-module/dom/insert-after.mjs.map +1 -7
  126. package/build-module/dom/is-edge.mjs +53 -69
  127. package/build-module/dom/is-edge.mjs.map +1 -7
  128. package/build-module/dom/is-element.mjs +9 -6
  129. package/build-module/dom/is-element.mjs.map +1 -7
  130. package/build-module/dom/is-empty.mjs +20 -21
  131. package/build-module/dom/is-empty.mjs.map +1 -7
  132. package/build-module/dom/is-entirely-selected.mjs +51 -47
  133. package/build-module/dom/is-entirely-selected.mjs.map +1 -7
  134. package/build-module/dom/is-form-element.mjs +15 -11
  135. package/build-module/dom/is-form-element.mjs.map +1 -7
  136. package/build-module/dom/is-horizontal-edge.mjs +13 -6
  137. package/build-module/dom/is-horizontal-edge.mjs.map +1 -7
  138. package/build-module/dom/is-html-input-element.mjs +9 -6
  139. package/build-module/dom/is-html-input-element.mjs.map +1 -7
  140. package/build-module/dom/is-input-or-text-area.mjs +9 -6
  141. package/build-module/dom/is-input-or-text-area.mjs.map +1 -7
  142. package/build-module/dom/is-number-input.mjs +16 -10
  143. package/build-module/dom/is-number-input.mjs.map +1 -7
  144. package/build-module/dom/is-rtl.mjs +12 -6
  145. package/build-module/dom/is-rtl.mjs.map +1 -7
  146. package/build-module/dom/is-selection-forward.mjs +22 -19
  147. package/build-module/dom/is-selection-forward.mjs.map +1 -7
  148. package/build-module/dom/is-text-field.mjs +27 -21
  149. package/build-module/dom/is-text-field.mjs.map +1 -7
  150. package/build-module/dom/is-vertical-edge.mjs +13 -6
  151. package/build-module/dom/is-vertical-edge.mjs.map +1 -7
  152. package/build-module/dom/place-caret-at-edge.mjs +51 -52
  153. package/build-module/dom/place-caret-at-edge.mjs.map +1 -7
  154. package/build-module/dom/place-caret-at-horizontal-edge.mjs +11 -6
  155. package/build-module/dom/place-caret-at-horizontal-edge.mjs.map +1 -7
  156. package/build-module/dom/place-caret-at-vertical-edge.mjs +12 -6
  157. package/build-module/dom/place-caret-at-vertical-edge.mjs.map +1 -7
  158. package/build-module/dom/remove-invalid-html.mjs +17 -9
  159. package/build-module/dom/remove-invalid-html.mjs.map +1 -7
  160. package/build-module/dom/remove.mjs +11 -7
  161. package/build-module/dom/remove.mjs.map +1 -7
  162. package/build-module/dom/replace-tag.mjs +17 -12
  163. package/build-module/dom/replace-tag.mjs.map +1 -7
  164. package/build-module/dom/replace.mjs +13 -8
  165. package/build-module/dom/replace.mjs.map +1 -7
  166. package/build-module/dom/safe-html.mjs +27 -24
  167. package/build-module/dom/safe-html.mjs.map +1 -7
  168. package/build-module/dom/scroll-if-no-range.mjs +21 -14
  169. package/build-module/dom/scroll-if-no-range.mjs.map +1 -7
  170. package/build-module/dom/strip-html.mjs +15 -9
  171. package/build-module/dom/strip-html.mjs.map +1 -7
  172. package/build-module/dom/types.mjs +0 -0
  173. package/build-module/dom/unwrap.mjs +13 -11
  174. package/build-module/dom/unwrap.mjs.map +1 -7
  175. package/build-module/dom/wrap.mjs +13 -8
  176. package/build-module/dom/wrap.mjs.map +1 -7
  177. package/build-module/focusable.mjs +96 -54
  178. package/build-module/focusable.mjs.map +1 -7
  179. package/build-module/index.mjs +11 -5
  180. package/build-module/index.mjs.map +1 -7
  181. package/build-module/phrasing-content.mjs +158 -134
  182. package/build-module/phrasing-content.mjs.map +1 -7
  183. package/build-module/tabbable.mjs +117 -52
  184. package/build-module/tabbable.mjs.map +1 -7
  185. package/build-module/types.mjs +0 -0
  186. package/build-module/utils/assert-is-defined.mjs +4 -9
  187. package/build-module/utils/assert-is-defined.mjs.map +1 -7
  188. package/build-types/data-transfer.d.ts +2 -2
  189. package/build-types/data-transfer.d.ts.map +1 -1
  190. package/build-types/dom/caret-range-from-point.d.ts +4 -4
  191. package/build-types/dom/caret-range-from-point.d.ts.map +1 -1
  192. package/build-types/dom/clean-node-list.d.ts +6 -46
  193. package/build-types/dom/clean-node-list.d.ts.map +1 -1
  194. package/build-types/dom/compute-caret-rect.d.ts +2 -2
  195. package/build-types/dom/compute-caret-rect.d.ts.map +1 -1
  196. package/build-types/dom/document-has-selection.d.ts +2 -2
  197. package/build-types/dom/document-has-selection.d.ts.map +1 -1
  198. package/build-types/dom/document-has-text-selection.d.ts +2 -2
  199. package/build-types/dom/document-has-text-selection.d.ts.map +1 -1
  200. package/build-types/dom/document-has-uncollapsed-selection.d.ts +2 -2
  201. package/build-types/dom/document-has-uncollapsed-selection.d.ts.map +1 -1
  202. package/build-types/dom/get-computed-style.d.ts +3 -3
  203. package/build-types/dom/get-computed-style.d.ts.map +1 -1
  204. package/build-types/dom/get-offset-parent.d.ts +2 -2
  205. package/build-types/dom/get-offset-parent.d.ts.map +1 -1
  206. package/build-types/dom/get-range-height.d.ts +2 -2
  207. package/build-types/dom/get-range-height.d.ts.map +1 -1
  208. package/build-types/dom/get-rectangle-from-range.d.ts +2 -2
  209. package/build-types/dom/get-rectangle-from-range.d.ts.map +1 -1
  210. package/build-types/dom/get-scroll-container.d.ts +5 -5
  211. package/build-types/dom/get-scroll-container.d.ts.map +1 -1
  212. package/build-types/dom/hidden-caret-range-from-point.d.ts +5 -5
  213. package/build-types/dom/hidden-caret-range-from-point.d.ts.map +1 -1
  214. package/build-types/dom/index.d.ts.map +1 -1
  215. package/build-types/dom/input-field-has-uncollapsed-selection.d.ts +2 -2
  216. package/build-types/dom/input-field-has-uncollapsed-selection.d.ts.map +1 -1
  217. package/build-types/dom/insert-after.d.ts +2 -3
  218. package/build-types/dom/insert-after.d.ts.map +1 -1
  219. package/build-types/dom/is-edge.d.ts +4 -4
  220. package/build-types/dom/is-edge.d.ts.map +1 -1
  221. package/build-types/dom/is-element.d.ts.map +1 -1
  222. package/build-types/dom/is-empty.d.ts +3 -3
  223. package/build-types/dom/is-empty.d.ts.map +1 -1
  224. package/build-types/dom/is-entirely-selected.d.ts +2 -2
  225. package/build-types/dom/is-entirely-selected.d.ts.map +1 -1
  226. package/build-types/dom/is-form-element.d.ts +3 -3
  227. package/build-types/dom/is-form-element.d.ts.map +1 -1
  228. package/build-types/dom/is-horizontal-edge.d.ts.map +1 -1
  229. package/build-types/dom/is-html-input-element.d.ts +1 -1
  230. package/build-types/dom/is-html-input-element.d.ts.map +1 -1
  231. package/build-types/dom/is-input-or-text-area.d.ts.map +1 -1
  232. package/build-types/dom/is-number-input.d.ts +2 -2
  233. package/build-types/dom/is-number-input.d.ts.map +1 -1
  234. package/build-types/dom/is-rtl.d.ts +2 -2
  235. package/build-types/dom/is-rtl.d.ts.map +1 -1
  236. package/build-types/dom/is-selection-forward.d.ts +2 -2
  237. package/build-types/dom/is-selection-forward.d.ts.map +1 -1
  238. package/build-types/dom/is-text-field.d.ts +2 -2
  239. package/build-types/dom/is-text-field.d.ts.map +1 -1
  240. package/build-types/dom/is-vertical-edge.d.ts.map +1 -1
  241. package/build-types/dom/place-caret-at-edge.d.ts +3 -3
  242. package/build-types/dom/place-caret-at-edge.d.ts.map +1 -1
  243. package/build-types/dom/place-caret-at-horizontal-edge.d.ts.map +1 -1
  244. package/build-types/dom/place-caret-at-vertical-edge.d.ts.map +1 -1
  245. package/build-types/dom/remove-invalid-html.d.ts +5 -4
  246. package/build-types/dom/remove-invalid-html.d.ts.map +1 -1
  247. package/build-types/dom/remove.d.ts +1 -2
  248. package/build-types/dom/remove.d.ts.map +1 -1
  249. package/build-types/dom/replace-tag.d.ts +3 -3
  250. package/build-types/dom/replace-tag.d.ts.map +1 -1
  251. package/build-types/dom/replace.d.ts +2 -3
  252. package/build-types/dom/replace.d.ts.map +1 -1
  253. package/build-types/dom/safe-html.d.ts +2 -2
  254. package/build-types/dom/safe-html.d.ts.map +1 -1
  255. package/build-types/dom/scroll-if-no-range.d.ts +5 -5
  256. package/build-types/dom/scroll-if-no-range.d.ts.map +1 -1
  257. package/build-types/dom/strip-html.d.ts +2 -2
  258. package/build-types/dom/strip-html.d.ts.map +1 -1
  259. package/build-types/dom/types.d.ts +32 -0
  260. package/build-types/dom/types.d.ts.map +1 -0
  261. package/build-types/dom/unwrap.d.ts +1 -3
  262. package/build-types/dom/unwrap.d.ts.map +1 -1
  263. package/build-types/dom/wrap.d.ts +2 -2
  264. package/build-types/dom/wrap.d.ts.map +1 -1
  265. package/build-types/focusable.d.ts +11 -30
  266. package/build-types/focusable.d.ts.map +1 -1
  267. package/build-types/index.d.ts +17 -0
  268. package/build-types/index.d.ts.map +1 -1
  269. package/build-types/phrasing-content.d.ts +9 -24
  270. package/build-types/phrasing-content.d.ts.map +1 -1
  271. package/build-types/tabbable.d.ts +10 -15
  272. package/build-types/tabbable.d.ts.map +1 -1
  273. package/build-types/types.d.ts +29 -0
  274. package/build-types/types.d.ts.map +1 -0
  275. package/package.json +6 -7
  276. package/src/{data-transfer.js → data-transfer.ts} +3 -3
  277. package/src/dom/{caret-range-from-point.js → caret-range-from-point.ts} +9 -5
  278. package/src/dom/{clean-node-list.js → clean-node-list.ts} +16 -24
  279. package/src/dom/{compute-caret-rect.js → compute-caret-rect.ts} +3 -3
  280. package/src/dom/{document-has-selection.js → document-has-selection.ts} +3 -3
  281. package/src/dom/{document-has-text-selection.js → document-has-text-selection.ts} +3 -3
  282. package/src/dom/{document-has-uncollapsed-selection.js → document-has-uncollapsed-selection.ts} +5 -3
  283. package/src/dom/{get-computed-style.js → get-computed-style.ts} +5 -3
  284. package/src/dom/{get-offset-parent.js → get-offset-parent.ts} +9 -14
  285. package/src/dom/{get-range-height.js → get-range-height.ts} +3 -3
  286. package/src/dom/{get-rectangle-from-range.js → get-rectangle-from-range.ts} +6 -12
  287. package/src/dom/{get-scroll-container.js → get-scroll-container.ts} +9 -9
  288. package/src/dom/{hidden-caret-range-from-point.js → hidden-caret-range-from-point.ts} +11 -6
  289. package/src/dom/{input-field-has-uncollapsed-selection.js → input-field-has-uncollapsed-selection.ts} +7 -5
  290. package/src/dom/{insert-after.js → insert-after.ts} +6 -4
  291. package/src/dom/{is-edge.js → is-edge.ts} +44 -48
  292. package/src/dom/{is-element.js → is-element.ts} +3 -1
  293. package/src/dom/{is-empty.js → is-empty.ts} +5 -7
  294. package/src/dom/{is-entirely-selected.js → is-entirely-selected.ts} +14 -11
  295. package/src/dom/{is-form-element.js → is-form-element.ts} +5 -3
  296. package/src/dom/{is-horizontal-edge.js → is-horizontal-edge.ts} +4 -1
  297. package/src/dom/{is-html-input-element.js → is-html-input-element.ts} +3 -1
  298. package/src/dom/{is-input-or-text-area.js → is-input-or-text-area.ts} +3 -1
  299. package/src/dom/{is-number-input.js → is-number-input.ts} +3 -3
  300. package/src/dom/{is-rtl.js → is-rtl.ts} +3 -3
  301. package/src/dom/{is-selection-forward.js → is-selection-forward.ts} +3 -3
  302. package/src/dom/{is-text-field.js → is-text-field.ts} +4 -4
  303. package/src/dom/{is-vertical-edge.js → is-vertical-edge.ts} +4 -1
  304. package/src/dom/{place-caret-at-edge.js → place-caret-at-edge.ts} +17 -9
  305. package/src/dom/{place-caret-at-horizontal-edge.js → place-caret-at-horizontal-edge.ts} +4 -1
  306. package/src/dom/{place-caret-at-vertical-edge.js → place-caret-at-vertical-edge.ts} +5 -1
  307. package/src/dom/{remove-invalid-html.js → remove-invalid-html.ts} +9 -4
  308. package/src/dom/{remove.js → remove.ts} +2 -3
  309. package/src/dom/{replace-tag.js → replace-tag.ts} +4 -4
  310. package/src/dom/{replace.js → replace.ts} +6 -4
  311. package/src/dom/{safe-html.js → safe-html.ts} +3 -3
  312. package/src/dom/{scroll-if-no-range.js → scroll-if-no-range.ts} +9 -5
  313. package/src/dom/{strip-html.js → strip-html.ts} +3 -3
  314. package/src/dom/test/{get-rectangle-from-range.browser.test.js → get-rectangle-from-range.browser.test.ts} +25 -25
  315. package/src/dom/types.ts +28 -0
  316. package/src/dom/{unwrap.js → unwrap.ts} +2 -4
  317. package/src/dom/{wrap.js → wrap.ts} +3 -3
  318. package/src/{focusable.js → focusable.ts} +34 -32
  319. package/src/index.ts +33 -0
  320. package/src/{phrasing-content.js → phrasing-content.ts} +15 -30
  321. package/src/{tabbable.js → tabbable.ts} +48 -39
  322. package/src/test/{dom.jsdom.test.js → dom.jsdom.test.ts} +30 -6
  323. package/src/test/{focusable.browser.test.js → focusable.browser.test.ts} +14 -13
  324. package/src/test/{tabbable.browser.test.js → tabbable.browser.test.ts} +3 -2
  325. package/src/types.ts +32 -0
  326. package/CHANGELOG.md +0 -317
  327. package/build/dom/index.cjs.map +0 -7
  328. package/build-module/dom/index.mjs.map +0 -7
  329. package/src/index.js +0 -12
  330. /package/src/dom/{index.js → index.ts} +0 -0
  331. /package/src/dom/test/{safe-html.jsdom.test.js → safe-html.jsdom.test.ts} +0 -0
  332. /package/src/dom/test/{strip-html.jsdom.test.js → strip-html.jsdom.test.ts} +0 -0
  333. /package/src/test/{focusable-area.jsdom.test.js → focusable-area.jsdom.test.ts} +0 -0
  334. /package/src/test/{utils.js → utils.ts} +0 -0
@@ -1,15 +1,20 @@
1
1
  import cleanNodeList from './clean-node-list';
2
+ import type { Schema } from './types';
2
3
 
3
4
  /**
4
5
  * Given a schema, unwraps or removes nodes, attributes and classes on HTML.
5
6
  *
6
- * @param {string} HTML The HTML to clean up.
7
- * @param {import('./clean-node-list').Schema} schema Schema for the HTML.
8
- * @param {boolean} inline Whether to clean for inline mode.
7
+ * @param {string} HTML The HTML to clean up.
8
+ * @param {Schema} schema Schema for the HTML.
9
+ * @param {boolean} [inline] Whether to clean for inline mode.
9
10
  *
10
11
  * @return {string} The cleaned up HTML.
11
12
  */
12
- export default function removeInvalidHTML( HTML, schema, inline ) {
13
+ export default function removeInvalidHTML(
14
+ HTML: string,
15
+ schema: Schema,
16
+ inline?: boolean
17
+ ): string {
13
18
  const doc = document.implementation.createHTMLDocument( '' );
14
19
 
15
20
  doc.body.innerHTML = HTML;
@@ -3,10 +3,9 @@ import { assertIsDefined } from '../utils/assert-is-defined';
3
3
  /**
4
4
  * Given a DOM node, removes it from the DOM.
5
5
  *
6
- * @param {Node} node Node to be removed.
7
- * @return {void}
6
+ * @param node Node to be removed.
8
7
  */
9
- export default function remove( node ) {
8
+ export default function remove( node: Node ): void {
10
9
  assertIsDefined( node.parentNode, 'node.parentNode' );
11
10
  node.parentNode.removeChild( node );
12
11
  }
@@ -3,12 +3,12 @@ import { assertIsDefined } from '../utils/assert-is-defined';
3
3
  /**
4
4
  * Replaces the given node with a new node with the given tag name.
5
5
  *
6
- * @param {Element} node The node to replace
7
- * @param {string} tagName The new tag name.
6
+ * @param node The node to replace
7
+ * @param tagName The new tag name.
8
8
  *
9
- * @return {Element} The new node.
9
+ * @return The new node.
10
10
  */
11
- export default function replaceTag( node, tagName ) {
11
+ export default function replaceTag( node: Element, tagName: string ): Element {
12
12
  const newNode = node.ownerDocument.createElement( tagName );
13
13
 
14
14
  while ( node.firstChild ) {
@@ -5,11 +5,13 @@ import remove from './remove';
5
5
  /**
6
6
  * Given two DOM nodes, replaces the former with the latter in the DOM.
7
7
  *
8
- * @param {Element} processedNode Node to be removed.
9
- * @param {Element} newNode Node to be inserted in its place.
10
- * @return {void}
8
+ * @param processedNode Node to be removed.
9
+ * @param newNode Node to be inserted in its place.
11
10
  */
12
- export default function replace( processedNode, newNode ) {
11
+ export default function replace(
12
+ processedNode: Element,
13
+ newNode: Element
14
+ ): void {
13
15
  assertIsDefined( processedNode.parentNode, 'processedNode.parentNode' );
14
16
  insertAfter( newNode, processedNode.parentNode );
15
17
  remove( processedNode );
@@ -3,11 +3,11 @@ import remove from './remove';
3
3
  /**
4
4
  * Strips scripts and on* attributes from HTML.
5
5
  *
6
- * @param {string} html HTML to sanitize.
6
+ * @param html HTML to sanitize.
7
7
  *
8
- * @return {string} The sanitized HTML.
8
+ * @return The sanitized HTML.
9
9
  */
10
- export default function safeHTML( html ) {
10
+ export default function safeHTML( html: string ): string {
11
11
  const { body } = document.implementation.createHTMLDocument( '' );
12
12
  body.innerHTML = html;
13
13
  const elements = body.getElementsByTagName( '*' );
@@ -2,13 +2,17 @@
2
2
  * If no range range can be created or it is outside the container, the element
3
3
  * may be out of view, so scroll it into view and try again.
4
4
  *
5
- * @param {HTMLElement} container The container to scroll.
6
- * @param {boolean} alignToTop True to align to top, false to bottom.
7
- * @param {Function} callback The callback to create the range.
5
+ * @param container The container to scroll.
6
+ * @param alignToTop True to align to top, false to bottom.
7
+ * @param callback The callback to create the range.
8
8
  *
9
- * @return {?Range} The range returned by the callback.
9
+ * @return The range returned by the callback.
10
10
  */
11
- export function scrollIfNoRange( container, alignToTop, callback ) {
11
+ export function scrollIfNoRange(
12
+ container: HTMLElement,
13
+ alignToTop: boolean,
14
+ callback: () => Range | null
15
+ ): Range | null {
12
16
  let range = callback();
13
17
 
14
18
  // If no range range can be created or it is outside the container, the
@@ -3,11 +3,11 @@ import safeHTML from './safe-html';
3
3
  /**
4
4
  * Removes any HTML tags from the provided string.
5
5
  *
6
- * @param {string} html The string containing html.
6
+ * @param html The string containing html.
7
7
  *
8
- * @return {string} The text content with any html removed.
8
+ * @return The text content with any html removed.
9
9
  */
10
- export default function stripHTML( html ) {
10
+ export default function stripHTML( html: string ): string {
11
11
  // Remove any script tags or on* attributes otherwise their *contents* will be left
12
12
  // in place following removal of HTML tags.
13
13
  html = safeHTML( html );
@@ -2,7 +2,7 @@ import { afterEach, beforeEach, describe, expect, it } from 'vitest';
2
2
  import getRectangleFromRange from '../get-rectangle-from-range';
3
3
 
4
4
  describe( 'getRectangleFromRange', () => {
5
- let container;
5
+ let container: HTMLDivElement;
6
6
 
7
7
  beforeEach( () => {
8
8
  container = document.createElement( 'div' );
@@ -13,7 +13,7 @@ describe( 'getRectangleFromRange', () => {
13
13
  container.remove();
14
14
  } );
15
15
 
16
- function collapsedRange( node, offset ) {
16
+ function collapsedRange( node: Node, offset: number ) {
17
17
  const range = document.createRange();
18
18
  range.setStart( node, offset );
19
19
  range.collapse( true );
@@ -21,26 +21,26 @@ describe( 'getRectangleFromRange', () => {
21
21
  }
22
22
 
23
23
  // The caret rectangle the browser gives for a position in a text node.
24
- function caretBox( node, offset ) {
24
+ function caretBox( node: Node, offset: number ) {
25
25
  return collapsedRange( node, offset ).getClientRects()[ 0 ].toJSON();
26
26
  }
27
27
 
28
- function box( rect ) {
29
- return rect.toJSON();
28
+ function box( rect: DOMRect | null ) {
29
+ return rect!.toJSON();
30
30
  }
31
31
 
32
32
  it( 'measures a position after the last child of an element at the end of its text', () => {
33
33
  container.innerHTML = '<div>wordpress.org</div>';
34
- const element = container.firstChild;
34
+ const element = container.firstChild as HTMLDivElement;
35
35
  const range = collapsedRange( element, 1 );
36
- const mutations = [];
36
+ const mutations: MutationRecord[] = [];
37
37
  new window.MutationObserver( ( records ) =>
38
38
  mutations.push( ...records )
39
39
  ).observe( element, { childList: true, subtree: true } );
40
40
 
41
41
  expect( range.getClientRects() ).toHaveLength( 0 );
42
42
  expect( box( getRectangleFromRange( range ) ) ).toEqual(
43
- caretBox( element.firstChild, 13 )
43
+ caretBox( element.firstChild!, 13 )
44
44
  );
45
45
  expect( range.startContainer ).toBe( element );
46
46
  return Promise.resolve().then( () => {
@@ -50,20 +50,20 @@ describe( 'getRectangleFromRange', () => {
50
50
 
51
51
  it( 'measures a position before the first child of an element at the start of its text', () => {
52
52
  container.innerHTML = '<div><em>abc</em>def</div>';
53
- const element = container.firstChild;
53
+ const element = container.firstChild as HTMLDivElement;
54
54
 
55
55
  expect(
56
56
  box( getRectangleFromRange( collapsedRange( element, 0 ) ) )
57
- ).toEqual( caretBox( element.querySelector( 'em' ).firstChild, 0 ) );
57
+ ).toEqual( caretBox( element.querySelector( 'em' )!.firstChild!, 0 ) );
58
58
  } );
59
59
 
60
60
  it( 'measures a position after a line break at the start of the next line', () => {
61
61
  container.innerHTML = '<p>abc<br>def</p>';
62
- const paragraph = container.firstChild;
63
- const nextLine = caretBox( paragraph.lastChild, 0 );
62
+ const paragraph = container.firstChild as HTMLParagraphElement;
63
+ const nextLine = caretBox( paragraph.lastChild!, 0 );
64
64
 
65
65
  expect( nextLine.top ).toBeGreaterThan(
66
- caretBox( paragraph.firstChild, 3 ).top
66
+ caretBox( paragraph.firstChild!, 3 ).top
67
67
  );
68
68
  expect(
69
69
  box( getRectangleFromRange( collapsedRange( paragraph, 2 ) ) )
@@ -73,11 +73,11 @@ describe( 'getRectangleFromRange', () => {
73
73
  it( 'returns null for a position between texts on different lines', () => {
74
74
  container.innerHTML =
75
75
  '<p style="width: 3ch; font-family: monospace; overflow-wrap: anywhere;">abc<em>def</em></p>';
76
- const paragraph = container.firstChild;
76
+ const paragraph = container.firstChild as HTMLParagraphElement;
77
77
 
78
78
  expect(
79
- caretBox( paragraph.lastChild.firstChild, 0 ).top
80
- ).toBeGreaterThan( caretBox( paragraph.firstChild, 3 ).top );
79
+ caretBox( paragraph.lastChild!.firstChild!, 0 ).top
80
+ ).toBeGreaterThan( caretBox( paragraph.firstChild!, 3 ).top );
81
81
  expect(
82
82
  getRectangleFromRange( collapsedRange( paragraph, 1 ) )
83
83
  ).toBeNull();
@@ -85,40 +85,40 @@ describe( 'getRectangleFromRange', () => {
85
85
 
86
86
  it( 'measures a position between texts on the same line', () => {
87
87
  container.innerHTML = '<p>abc<em>def</em></p>';
88
- const paragraph = container.firstChild;
88
+ const paragraph = container.firstChild as HTMLParagraphElement;
89
89
 
90
90
  expect(
91
91
  box( getRectangleFromRange( collapsedRange( paragraph, 1 ) ) )
92
- ).toEqual( caretBox( paragraph.lastChild.firstChild, 0 ) );
92
+ ).toEqual( caretBox( paragraph.lastChild!.firstChild!, 0 ) );
93
93
  } );
94
94
 
95
95
  it( 'measures a position inside an empty inline element beside the text next to it', () => {
96
96
  container.innerHTML =
97
97
  '<p><span data-rich-text-placeholder="Type"></span></p>';
98
- const paragraph = container.firstChild;
99
- const placeholder = paragraph.querySelector( 'span' );
98
+ const paragraph = container.firstChild as HTMLParagraphElement;
99
+ const placeholder = paragraph.querySelector( 'span' )!;
100
100
 
101
101
  expect(
102
102
  box( getRectangleFromRange( collapsedRange( placeholder, 0 ) ) )
103
- ).toEqual( caretBox( paragraph.firstChild, 1 ) );
103
+ ).toEqual( caretBox( paragraph.firstChild!, 1 ) );
104
104
  } );
105
105
 
106
106
  it( 'measures a position inside a line break at the end of the text before it', () => {
107
107
  container.innerHTML = '<p>abc<br>def</p>';
108
- const paragraph = container.firstChild;
108
+ const paragraph = container.firstChild as HTMLParagraphElement;
109
109
 
110
110
  expect(
111
111
  box(
112
112
  getRectangleFromRange(
113
- collapsedRange( paragraph.querySelector( 'br' ), 0 )
113
+ collapsedRange( paragraph.querySelector( 'br' )!, 0 )
114
114
  )
115
115
  )
116
- ).toEqual( caretBox( paragraph.firstChild, 3 ) );
116
+ ).toEqual( caretBox( paragraph.firstChild!, 3 ) );
117
117
  } );
118
118
 
119
119
  it( 'returns null for a position with no text on either side', () => {
120
120
  container.innerHTML = '<p><br></p>';
121
- const paragraph = container.firstChild;
121
+ const paragraph = container.firstChild as HTMLParagraphElement;
122
122
 
123
123
  expect(
124
124
  getRectangleFromRange( collapsedRange( paragraph, 1 ) )
@@ -0,0 +1,28 @@
1
+ export interface SchemaItem {
2
+ /**
3
+ * Attributes.
4
+ */
5
+ attributes?: string[];
6
+ /**
7
+ * Classnames or RegExp to test against. Use '*' to keep all classes.
8
+ */
9
+ classes?: ( string | RegExp )[];
10
+ /**
11
+ * Child schemas.
12
+ */
13
+ children?: '*' | { [ tag: string ]: SchemaItem };
14
+ /**
15
+ * Selectors to test required children against. Leave empty or undefined if there are no requirements.
16
+ */
17
+ require?: string[];
18
+ /**
19
+ * Whether to allow nodes without children.
20
+ */
21
+ allowEmpty?: boolean;
22
+ /**
23
+ * Function to test whether a node is a match. If left undefined any node will be assumed to match.
24
+ */
25
+ isMatch?: ( node: Node ) => boolean;
26
+ }
27
+
28
+ export type Schema = { [ tag: string ]: SchemaItem };
@@ -3,11 +3,9 @@ import { assertIsDefined } from '../utils/assert-is-defined';
3
3
  /**
4
4
  * Unwrap the given node. This means any child nodes are moved to the parent.
5
5
  *
6
- * @param {Node} node The node to unwrap.
7
- *
8
- * @return {void}
6
+ * @param node The node to unwrap.
9
7
  */
10
- export default function unwrap( node ) {
8
+ export default function unwrap( node: Node ): void {
11
9
  const parent = node.parentNode;
12
10
 
13
11
  assertIsDefined( parent, 'node.parentNode' );
@@ -3,10 +3,10 @@ import { assertIsDefined } from '../utils/assert-is-defined';
3
3
  /**
4
4
  * Wraps the given node with a new node with the given tag name.
5
5
  *
6
- * @param {Element} newNode The node to insert.
7
- * @param {Element} referenceNode The node to wrap.
6
+ * @param newNode The node to insert.
7
+ * @param referenceNode The node to wrap.
8
8
  */
9
- export default function wrap( newNode, referenceNode ) {
9
+ export default function wrap( newNode: Element, referenceNode: Element ) {
10
10
  assertIsDefined( referenceNode.parentNode, 'referenceNode.parentNode' );
11
11
  referenceNode.parentNode.insertBefore( newNode, referenceNode );
12
12
  newNode.appendChild( referenceNode );
@@ -1,3 +1,5 @@
1
+ import type { FindFocusableOptions } from './types';
2
+
1
3
  /**
2
4
  * References:
3
5
  *
@@ -20,15 +22,15 @@
20
22
  /**
21
23
  * Returns a CSS selector used to query for focusable elements.
22
24
  *
23
- * @param {boolean} sequential If set, only query elements that are sequentially
24
- * focusable. Non-interactive elements with a
25
- * negative `tabindex` are focusable but not
26
- * sequentially focusable.
27
- * https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute
25
+ * @param sequential If set, only query elements that are sequentially
26
+ * focusable. Non-interactive elements with a
27
+ * negative `tabindex` are focusable but not
28
+ * sequentially focusable.
29
+ * https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute
28
30
  *
29
- * @return {string} CSS selector.
31
+ * @return CSS selector.
30
32
  */
31
- function buildSelector( sequential ) {
33
+ function buildSelector( sequential: boolean ): string {
32
34
  return [
33
35
  sequential ? '[tabindex]:not([tabindex^="-"])' : '[tabindex]',
34
36
  'a[href]',
@@ -49,11 +51,11 @@ function buildSelector( sequential ) {
49
51
  * Returns true if the specified element has a layout box and is not hidden by
50
52
  * CSS visibility or content visibility.
51
53
  *
52
- * @param {HTMLElement} element DOM element to test.
54
+ * @param element DOM element to test.
53
55
  *
54
- * @return {boolean} Whether element is visible.
56
+ * @return Whether element is visible.
55
57
  */
56
- function isVisible( element ) {
58
+ function isVisible( element: HTMLElement ): boolean {
57
59
  if ( typeof element.checkVisibility === 'function' ) {
58
60
  if ( ! element.checkVisibility( { visibilityProperty: true } ) ) {
59
61
  return false;
@@ -80,19 +82,17 @@ function isVisible( element ) {
80
82
  * false otherwise. Area is only focusable if within a map where a named map
81
83
  * referenced by an image somewhere in the document.
82
84
  *
83
- * @param {HTMLAreaElement} element DOM area element to test.
85
+ * @param element DOM area element to test.
84
86
  *
85
- * @return {boolean} Whether area element is valid for focus.
87
+ * @return Whether area element is valid for focus.
86
88
  */
87
- function isValidFocusableArea( element ) {
88
- /** @type {HTMLMapElement | null} */
89
- const map = element.closest( 'map[name]' );
89
+ function isValidFocusableArea( element: HTMLAreaElement ): boolean {
90
+ const map: HTMLMapElement | null = element.closest( 'map[name]' );
90
91
  if ( ! map ) {
91
92
  return false;
92
93
  }
93
94
 
94
- /** @type {HTMLImageElement | null} */
95
- const img = element.ownerDocument.querySelector(
95
+ const img: HTMLImageElement | null = element.ownerDocument.querySelector(
96
96
  'img[usemap="#' + map.name + '"]'
97
97
  );
98
98
  return !! img && ! img.closest( '[inert]' ) && isVisible( img );
@@ -101,28 +101,30 @@ function isValidFocusableArea( element ) {
101
101
  /**
102
102
  * Returns all focusable elements within a given context.
103
103
  *
104
- * @param {Element} context Element in which to search.
105
- * @param {Object} options
106
- * @param {boolean} [options.sequential] If set, only return elements that are
107
- * sequentially focusable.
108
- * Non-interactive elements with a
109
- * negative `tabindex` are focusable but
110
- * not sequentially focusable.
111
- * https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute
104
+ * @param context Element in which to search.
105
+ * @param options
106
+ * @param [options.sequential] If set, only return elements that are
107
+ * sequentially focusable.
108
+ * Non-interactive elements with a
109
+ * negative `tabindex` are focusable but
110
+ * not sequentially focusable.
111
+ * https://html.spec.whatwg.org/multipage/interaction.html#the-tabindex-attribute
112
112
  *
113
- * @return {HTMLElement[]} Focusable elements.
113
+ * @return Focusable elements.
114
114
  */
115
- export function find( context, { sequential = false } = {} ) {
116
- /** @type {NodeListOf<HTMLElement>} */
117
- const elements = context.querySelectorAll( buildSelector( sequential ) );
115
+ export function find(
116
+ context: Element,
117
+ { sequential = false }: FindFocusableOptions = {}
118
+ ): HTMLElement[] {
119
+ const elements: NodeListOf< HTMLElement > = context.querySelectorAll(
120
+ buildSelector( sequential )
121
+ );
118
122
 
119
123
  return Array.from( elements ).filter( ( element ) => {
120
124
  const { nodeName } = element;
121
125
  if ( 'AREA' === nodeName ) {
122
126
  // The mapped image determines whether this region is visible or inert.
123
- return isValidFocusableArea(
124
- /** @type {HTMLAreaElement} */ ( element )
125
- );
127
+ return isValidFocusableArea( element as HTMLAreaElement );
126
128
  }
127
129
 
128
130
  // Elements inside an inert subtree are not focusable.
package/src/index.ts ADDED
@@ -0,0 +1,33 @@
1
+ import * as focusable from './focusable';
2
+ import * as tabbable from './tabbable';
3
+
4
+ /**
5
+ * Object grouping `focusable` and `tabbable` utils
6
+ * under the keys with the same name.
7
+ */
8
+ export const focus = { focusable, tabbable };
9
+
10
+ export * from './dom';
11
+ export * from './phrasing-content';
12
+ export * from './data-transfer';
13
+
14
+ /**
15
+ * Schema of the content allowed inside an element, keyed by tag name.
16
+ */
17
+ export type { ContentSchema } from './types';
18
+
19
+ /**
20
+ * The attributes and children allowed for an element in a `ContentSchema`.
21
+ */
22
+ export type { SemanticElementDefinition } from './types';
23
+
24
+ /**
25
+ * Schema that `cleanNodeList` and `removeInvalidHTML` clean HTML against,
26
+ * keyed by tag name.
27
+ */
28
+ export type { Schema } from './dom/types';
29
+
30
+ /**
31
+ * The rules for a single tag in a `Schema`.
32
+ */
33
+ export type { SchemaItem } from './dom/types';
@@ -1,27 +1,17 @@
1
+ import type { ContentSchema } from './types';
2
+
1
3
  /**
2
4
  * All phrasing content elements.
3
5
  *
4
6
  * @see https://www.w3.org/TR/2011/WD-html5-20110525/content-models.html#phrasing-content-0
5
7
  */
6
8
 
7
- /**
8
- * @typedef {Record<string,SemanticElementDefinition>} ContentSchema
9
- */
10
-
11
- /**
12
- * @typedef SemanticElementDefinition
13
- * @property {string[]} [attributes] Content attributes
14
- * @property {ContentSchema|'*'} [children] Content attributes
15
- */
16
-
17
9
  /**
18
10
  * All text-level semantic elements.
19
11
  *
20
12
  * @see https://html.spec.whatwg.org/multipage/text-level-semantics.html
21
- *
22
- * @type {ContentSchema}
23
13
  */
24
- const textContentSchema = {
14
+ const textContentSchema: ContentSchema = {
25
15
  strong: {},
26
16
  em: {},
27
17
  s: {},
@@ -60,10 +50,8 @@ const textContentSchema = {
60
50
  * Embedded content elements.
61
51
  *
62
52
  * @see https://www.w3.org/TR/2011/WD-html5-20110525/content-models.html#embedded-content-0
63
- *
64
- * @type {ContentSchema}
65
53
  */
66
- const embeddedContentSchema = {
54
+ const embeddedContentSchema: ContentSchema = {
67
55
  audio: {
68
56
  attributes: [
69
57
  'src',
@@ -150,19 +138,16 @@ const phrasingContentSchema = {
150
138
  *
151
139
  * @see https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content
152
140
  *
153
- * @param {string} [context] Set to "paste" to exclude invisible elements and
154
- * sensitive data.
141
+ * @param [context] Set to "paste" to exclude invisible elements and
142
+ * sensitive data.
155
143
  *
156
- * @return {Partial<ContentSchema>} Schema.
144
+ * @return Schema.
157
145
  */
158
- export function getPhrasingContentSchema( context ) {
146
+ export function getPhrasingContentSchema( context?: string ): ContentSchema {
159
147
  if ( context !== 'paste' ) {
160
148
  return phrasingContentSchema;
161
149
  }
162
150
 
163
- /**
164
- * @type {Partial<ContentSchema>}
165
- */
166
151
  const {
167
152
  u, // Used to mark misspelling. Shouldn't be pasted.
168
153
  abbr, // Invisible.
@@ -172,7 +157,7 @@ export function getPhrasingContentSchema( context ) {
172
157
  bdi, // Invisible.
173
158
  bdo, // Invisible.
174
159
  ...remainingContentSchema
175
- } = {
160
+ }: ContentSchema = {
176
161
  ...phrasingContentSchema,
177
162
  // We shouldn't paste potentially sensitive information which is not
178
163
  // visible to the user when pasted, so strip the attributes.
@@ -188,20 +173,20 @@ export function getPhrasingContentSchema( context ) {
188
173
  *
189
174
  * @see https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Phrasing_content
190
175
  *
191
- * @param {Node} node The node to test.
176
+ * @param node The node to test.
192
177
  *
193
- * @return {boolean} True if phrasing content, false if not.
178
+ * @return True if phrasing content, false if not.
194
179
  */
195
- export function isPhrasingContent( node ) {
180
+ export function isPhrasingContent( node: Node ): boolean {
196
181
  const tag = node.nodeName.toLowerCase();
197
182
  return getPhrasingContentSchema().hasOwnProperty( tag ) || tag === 'span';
198
183
  }
199
184
 
200
185
  /**
201
- * @param {Node} node
202
- * @return {boolean} Node is text content
186
+ * @param node
187
+ * @return Node is text content
203
188
  */
204
- export function isTextContent( node ) {
189
+ export function isTextContent( node: Node ): boolean {
205
190
  const tag = node.nodeName.toLowerCase();
206
191
  return textContentSchema.hasOwnProperty( tag ) || tag === 'span';
207
192
  }