igniteui-webcomponents 6.0.1 → 6.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 (306) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/components/button/button-base.d.ts +5 -6
  3. package/components/button/button-base.js +15 -29
  4. package/components/button/button-base.js.map +1 -1
  5. package/components/button/themes/button/light/button.shared.css.js +1 -1
  6. package/components/button/themes/button/light/button.shared.css.js.map +1 -1
  7. package/components/button-group/toggle-button.d.ts +2 -2
  8. package/components/button-group/toggle-button.js +4 -6
  9. package/components/button-group/toggle-button.js.map +1 -1
  10. package/components/calendar/calendar.d.ts +1 -1
  11. package/components/calendar/calendar.js +12 -9
  12. package/components/calendar/calendar.js.map +1 -1
  13. package/components/calendar/days-view/days-view.d.ts +1 -1
  14. package/components/calendar/days-view/days-view.js +8 -9
  15. package/components/calendar/days-view/days-view.js.map +1 -1
  16. package/components/calendar/helpers.d.ts +12 -1
  17. package/components/calendar/helpers.js +35 -10
  18. package/components/calendar/helpers.js.map +1 -1
  19. package/components/calendar/model.d.ts +15 -1
  20. package/components/calendar/model.js +26 -5
  21. package/components/calendar/model.js.map +1 -1
  22. package/components/calendar/months-view/months-view.d.ts +1 -1
  23. package/components/calendar/months-view/months-view.js +6 -6
  24. package/components/calendar/months-view/months-view.js.map +1 -1
  25. package/components/calendar/years-view/years-view.d.ts +1 -1
  26. package/components/calendar/years-view/years-view.js +6 -6
  27. package/components/calendar/years-view/years-view.js.map +1 -1
  28. package/components/carousel/carousel-indicator-container.d.ts +2 -2
  29. package/components/carousel/carousel-indicator-container.js +8 -9
  30. package/components/carousel/carousel-indicator-container.js.map +1 -1
  31. package/components/carousel/carousel.d.ts +7 -8
  32. package/components/carousel/carousel.js +24 -20
  33. package/components/carousel/carousel.js.map +1 -1
  34. package/components/checkbox/checkbox-base.d.ts +8 -10
  35. package/components/checkbox/checkbox-base.js +20 -23
  36. package/components/checkbox/checkbox-base.js.map +1 -1
  37. package/components/checkbox/checkbox.d.ts +3 -3
  38. package/components/checkbox/checkbox.js +18 -19
  39. package/components/checkbox/checkbox.js.map +1 -1
  40. package/components/checkbox/switch.d.ts +2 -2
  41. package/components/checkbox/switch.js +15 -19
  42. package/components/checkbox/switch.js.map +1 -1
  43. package/components/chip/chip.js +3 -3
  44. package/components/chip/chip.js.map +1 -1
  45. package/components/combo/combo.d.ts +2 -2
  46. package/components/combo/combo.js +12 -11
  47. package/components/combo/combo.js.map +1 -1
  48. package/components/combo/themes/combo.base.css.js +1 -1
  49. package/components/combo/themes/combo.base.css.js.map +1 -1
  50. package/components/combo/themes/shared/combo.fluent.css.js +1 -1
  51. package/components/combo/themes/shared/combo.fluent.css.js.map +1 -1
  52. package/components/common/controllers/focus-ring.d.ts +21 -11
  53. package/components/common/controllers/focus-ring.js +16 -14
  54. package/components/common/controllers/focus-ring.js.map +1 -1
  55. package/components/common/controllers/key-bindings.d.ts +40 -33
  56. package/components/common/controllers/key-bindings.js +83 -71
  57. package/components/common/controllers/key-bindings.js.map +1 -1
  58. package/components/common/definitions/defineAllComponents.js +2 -0
  59. package/components/common/definitions/defineAllComponents.js.map +1 -1
  60. package/components/common/i18n/date-range-picker.resources.d.ts +11 -0
  61. package/components/common/i18n/date-range-picker.resources.js +12 -0
  62. package/components/common/i18n/date-range-picker.resources.js.map +1 -0
  63. package/components/common/mixins/combo-box.js +8 -2
  64. package/components/common/mixins/combo-box.js.map +1 -1
  65. package/components/common/mixins/forms/form-value.d.ts +15 -1
  66. package/components/common/mixins/forms/form-value.js +25 -4
  67. package/components/common/mixins/forms/form-value.js.map +1 -1
  68. package/components/common/mixins/option.d.ts +3 -2
  69. package/components/common/mixins/option.js.map +1 -1
  70. package/components/common/part-map.d.ts +17 -0
  71. package/components/common/part-map.js +46 -0
  72. package/components/common/part-map.js.map +1 -0
  73. package/components/common/util.d.ts +5 -6
  74. package/components/common/util.js +17 -22
  75. package/components/common/util.js.map +1 -1
  76. package/components/common/validators.js +3 -7
  77. package/components/common/validators.js.map +1 -1
  78. package/components/date-picker/date-picker.d.ts +3 -3
  79. package/components/date-picker/date-picker.js +13 -14
  80. package/components/date-picker/date-picker.js.map +1 -1
  81. package/components/date-picker/themes/dark/date-picker.bootstrap.css.js +1 -1
  82. package/components/date-picker/themes/dark/date-picker.bootstrap.css.js.map +1 -1
  83. package/components/date-picker/themes/dark/date-picker.fluent.css.js +1 -1
  84. package/components/date-picker/themes/dark/date-picker.fluent.css.js.map +1 -1
  85. package/components/date-picker/themes/dark/date-picker.indigo.css.js +1 -1
  86. package/components/date-picker/themes/dark/date-picker.indigo.css.js.map +1 -1
  87. package/components/date-picker/themes/dark/date-picker.material.css.js +1 -1
  88. package/components/date-picker/themes/dark/date-picker.material.css.js.map +1 -1
  89. package/components/date-picker/themes/light/date-picker.bootstrap.css.js +1 -1
  90. package/components/date-picker/themes/light/date-picker.bootstrap.css.js.map +1 -1
  91. package/components/date-picker/themes/light/date-picker.fluent.css.js +1 -1
  92. package/components/date-picker/themes/light/date-picker.fluent.css.js.map +1 -1
  93. package/components/date-picker/themes/light/date-picker.indigo.css.js +1 -1
  94. package/components/date-picker/themes/light/date-picker.indigo.css.js.map +1 -1
  95. package/components/date-picker/themes/light/date-picker.material.css.js +1 -1
  96. package/components/date-picker/themes/light/date-picker.material.css.js.map +1 -1
  97. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js +1 -1
  98. package/components/date-picker/themes/shared/date-picker.bootstrap.css.js.map +1 -1
  99. package/components/date-picker/themes/shared/date-picker.common.css.js +1 -1
  100. package/components/date-picker/themes/shared/date-picker.common.css.js.map +1 -1
  101. package/components/date-picker/themes/shared/date-picker.fluent.css.js +1 -1
  102. package/components/date-picker/themes/shared/date-picker.fluent.css.js.map +1 -1
  103. package/components/date-picker/themes/shared/date-picker.indigo.css.js +1 -1
  104. package/components/date-picker/themes/shared/date-picker.indigo.css.js.map +1 -1
  105. package/components/date-picker/themes/shared/date-picker.material.css.d.ts +1 -0
  106. package/components/date-picker/themes/shared/date-picker.material.css.js +3 -0
  107. package/components/date-picker/themes/shared/date-picker.material.css.js.map +1 -0
  108. package/components/date-picker/themes/themes.js +3 -2
  109. package/components/date-picker/themes/themes.js.map +1 -1
  110. package/components/date-range-picker/date-range-picker.base.css.d.ts +1 -0
  111. package/components/date-range-picker/date-range-picker.base.css.js +3 -0
  112. package/components/date-range-picker/date-range-picker.base.css.js.map +1 -0
  113. package/components/date-range-picker/date-range-picker.d.ts +365 -0
  114. package/components/date-range-picker/date-range-picker.js +810 -0
  115. package/components/date-range-picker/date-range-picker.js.map +1 -0
  116. package/components/date-range-picker/predefined-ranges-area.base.css.d.ts +1 -0
  117. package/components/date-range-picker/predefined-ranges-area.base.css.js +3 -0
  118. package/components/date-range-picker/predefined-ranges-area.base.css.js.map +1 -0
  119. package/components/date-range-picker/predefined-ranges-area.d.ts +36 -0
  120. package/components/date-range-picker/predefined-ranges-area.js +115 -0
  121. package/components/date-range-picker/predefined-ranges-area.js.map +1 -0
  122. package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.d.ts +1 -0
  123. package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.js +3 -0
  124. package/components/date-range-picker/themes/dark/date-range-picker.bootstrap.css.js.map +1 -0
  125. package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.d.ts +1 -0
  126. package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.js +3 -0
  127. package/components/date-range-picker/themes/dark/date-range-picker.fluent.css.js.map +1 -0
  128. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.d.ts +1 -0
  129. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js +3 -0
  130. package/components/date-range-picker/themes/dark/date-range-picker.indigo.css.js.map +1 -0
  131. package/components/date-range-picker/themes/dark/date-range-picker.material.css.d.ts +1 -0
  132. package/components/date-range-picker/themes/dark/date-range-picker.material.css.js +3 -0
  133. package/components/date-range-picker/themes/dark/date-range-picker.material.css.js.map +1 -0
  134. package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.d.ts +1 -0
  135. package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.js +3 -0
  136. package/components/date-range-picker/themes/light/date-range-picker.bootstrap.css.js.map +1 -0
  137. package/components/date-range-picker/themes/light/date-range-picker.fluent.css.d.ts +1 -0
  138. package/components/date-range-picker/themes/light/date-range-picker.fluent.css.js +3 -0
  139. package/components/date-range-picker/themes/light/date-range-picker.fluent.css.js.map +1 -0
  140. package/components/date-range-picker/themes/light/date-range-picker.indigo.css.d.ts +1 -0
  141. package/components/date-range-picker/themes/light/date-range-picker.indigo.css.js +3 -0
  142. package/components/date-range-picker/themes/light/date-range-picker.indigo.css.js.map +1 -0
  143. package/components/date-range-picker/themes/light/date-range-picker.material.css.d.ts +1 -0
  144. package/components/date-range-picker/themes/light/date-range-picker.material.css.js +3 -0
  145. package/components/date-range-picker/themes/light/date-range-picker.material.css.js.map +1 -0
  146. package/components/date-range-picker/themes/light/date-range-picker.shared.css.d.ts +1 -0
  147. package/components/date-range-picker/themes/light/date-range-picker.shared.css.js +3 -0
  148. package/components/date-range-picker/themes/light/date-range-picker.shared.css.js.map +1 -0
  149. package/components/date-range-picker/themes/ranges-themes.d.ts +2 -0
  150. package/components/date-range-picker/themes/ranges-themes.js +14 -0
  151. package/components/date-range-picker/themes/ranges-themes.js.map +1 -0
  152. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.d.ts +1 -0
  153. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js +3 -0
  154. package/components/date-range-picker/themes/shared/date-range-picker.bootstrap.css.js.map +1 -0
  155. package/components/date-range-picker/themes/shared/date-range-picker.common.css.d.ts +1 -0
  156. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js +3 -0
  157. package/components/date-range-picker/themes/shared/date-range-picker.common.css.js.map +1 -0
  158. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.d.ts +1 -0
  159. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js +3 -0
  160. package/components/date-range-picker/themes/shared/date-range-picker.fluent.css.js.map +1 -0
  161. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.d.ts +1 -0
  162. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js +3 -0
  163. package/components/date-range-picker/themes/shared/date-range-picker.indigo.css.js.map +1 -0
  164. package/components/date-range-picker/themes/shared/date-range-picker.material.css.d.ts +1 -0
  165. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js +3 -0
  166. package/components/date-range-picker/themes/shared/date-range-picker.material.css.js.map +1 -0
  167. package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.d.ts +1 -0
  168. package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.js +3 -0
  169. package/components/date-range-picker/themes/shared/predefined-ranges-area.common.css.js.map +1 -0
  170. package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.d.ts +1 -0
  171. package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.js +3 -0
  172. package/components/date-range-picker/themes/shared/predefined-ranges-area.indigo.css.js.map +1 -0
  173. package/components/date-range-picker/themes/themes.d.ts +2 -0
  174. package/components/date-range-picker/themes/themes.js +50 -0
  175. package/components/date-range-picker/themes/themes.js.map +1 -0
  176. package/components/date-range-picker/validators.d.ts +26 -0
  177. package/components/date-range-picker/validators.js +57 -0
  178. package/components/date-range-picker/validators.js.map +1 -0
  179. package/components/date-time-input/date-time-input.d.ts +2 -2
  180. package/components/date-time-input/date-time-input.js +7 -9
  181. package/components/date-time-input/date-time-input.js.map +1 -1
  182. package/components/date-time-input/date-util.d.ts +7 -0
  183. package/components/date-time-input/date-util.js +11 -0
  184. package/components/date-time-input/date-util.js.map +1 -1
  185. package/components/dialog/dialog.js +11 -10
  186. package/components/dialog/dialog.js.map +1 -1
  187. package/components/dialog/themes/dialog.base.css.js +1 -1
  188. package/components/dialog/themes/dialog.base.css.js.map +1 -1
  189. package/components/dialog/themes/shared/dialog.indigo.css.js +1 -1
  190. package/components/dialog/themes/shared/dialog.indigo.css.js.map +1 -1
  191. package/components/dropdown/dropdown.js.map +1 -1
  192. package/components/file-input/file-input.d.ts +11 -5
  193. package/components/file-input/file-input.js +23 -19
  194. package/components/file-input/file-input.js.map +1 -1
  195. package/components/file-input/themes/file-input.base.css.js +1 -1
  196. package/components/file-input/themes/file-input.base.css.js.map +1 -1
  197. package/components/input/input-base.d.ts +0 -1
  198. package/components/input/input-base.js +5 -4
  199. package/components/input/input-base.js.map +1 -1
  200. package/components/input/input.d.ts +2 -3
  201. package/components/input/input.js +10 -9
  202. package/components/input/input.js.map +1 -1
  203. package/components/input/themes/dark/input.bootstrap.css.js +1 -1
  204. package/components/input/themes/dark/input.bootstrap.css.js.map +1 -1
  205. package/components/input/themes/dark/input.indigo.css.js +1 -1
  206. package/components/input/themes/dark/input.indigo.css.js.map +1 -1
  207. package/components/input/themes/light/input.bootstrap.css.js +1 -1
  208. package/components/input/themes/light/input.bootstrap.css.js.map +1 -1
  209. package/components/input/themes/light/input.indigo.css.js +1 -1
  210. package/components/input/themes/light/input.indigo.css.js.map +1 -1
  211. package/components/input/themes/light/input.shared.css.js +1 -1
  212. package/components/input/themes/light/input.shared.css.js.map +1 -1
  213. package/components/input/themes/shared/input.bootstrap.css.js +1 -1
  214. package/components/input/themes/shared/input.bootstrap.css.js.map +1 -1
  215. package/components/input/themes/shared/input.common.css.js +1 -1
  216. package/components/input/themes/shared/input.common.css.js.map +1 -1
  217. package/components/input/themes/shared/input.fluent.css.js +1 -1
  218. package/components/input/themes/shared/input.fluent.css.js.map +1 -1
  219. package/components/input/themes/shared/input.indigo.css.js +1 -1
  220. package/components/input/themes/shared/input.indigo.css.js.map +1 -1
  221. package/components/input/themes/shared/input.material.css.js +1 -1
  222. package/components/input/themes/shared/input.material.css.js.map +1 -1
  223. package/components/mask-input/mask-input.d.ts +2 -3
  224. package/components/mask-input/mask-input.js +13 -12
  225. package/components/mask-input/mask-input.js.map +1 -1
  226. package/components/mask-input/mask-parser.d.ts +100 -14
  227. package/components/mask-input/mask-parser.js +134 -117
  228. package/components/mask-input/mask-parser.js.map +1 -1
  229. package/components/nav-drawer/nav-drawer-item.js +2 -6
  230. package/components/nav-drawer/nav-drawer-item.js.map +1 -1
  231. package/components/nav-drawer/nav-drawer.js +5 -6
  232. package/components/nav-drawer/nav-drawer.js.map +1 -1
  233. package/components/progress/base.js +6 -5
  234. package/components/progress/base.js.map +1 -1
  235. package/components/progress/circular-progress.js +7 -15
  236. package/components/progress/circular-progress.js.map +1 -1
  237. package/components/progress/linear-progress.js +5 -5
  238. package/components/progress/linear-progress.js.map +1 -1
  239. package/components/radio/radio.d.ts +11 -12
  240. package/components/radio/radio.js +39 -44
  241. package/components/radio/radio.js.map +1 -1
  242. package/components/radio/utils.js +6 -3
  243. package/components/radio/utils.js.map +1 -1
  244. package/components/rating/rating.d.ts +2 -2
  245. package/components/rating/rating.js +4 -4
  246. package/components/rating/rating.js.map +1 -1
  247. package/components/resize-container/resize-container.js +4 -4
  248. package/components/resize-container/resize-container.js.map +1 -1
  249. package/components/select/select.d.ts +2 -2
  250. package/components/select/select.js +11 -10
  251. package/components/select/select.js.map +1 -1
  252. package/components/select/themes/shared/select.fluent.css.js +1 -1
  253. package/components/select/themes/shared/select.fluent.css.js.map +1 -1
  254. package/components/slider/range-slider.js +1 -1
  255. package/components/slider/range-slider.js.map +1 -1
  256. package/components/slider/slider-base.js +1 -1
  257. package/components/slider/slider-base.js.map +1 -1
  258. package/components/slider/slider.d.ts +2 -3
  259. package/components/slider/slider.js +7 -7
  260. package/components/slider/slider.js.map +1 -1
  261. package/components/stepper/step.js +3 -3
  262. package/components/stepper/step.js.map +1 -1
  263. package/components/tabs/tabs.js +8 -6
  264. package/components/tabs/tabs.js.map +1 -1
  265. package/components/textarea/textarea.d.ts +2 -2
  266. package/components/textarea/textarea.js +7 -6
  267. package/components/textarea/textarea.js.map +1 -1
  268. package/components/textarea/themes/dark/textarea.bootstrap.css.js +1 -1
  269. package/components/textarea/themes/dark/textarea.bootstrap.css.js.map +1 -1
  270. package/components/textarea/themes/dark/textarea.indigo.css.js +1 -1
  271. package/components/textarea/themes/dark/textarea.indigo.css.js.map +1 -1
  272. package/components/textarea/themes/light/textarea.bootstrap.css.js +1 -1
  273. package/components/textarea/themes/light/textarea.bootstrap.css.js.map +1 -1
  274. package/components/textarea/themes/light/textarea.indigo.css.js +1 -1
  275. package/components/textarea/themes/light/textarea.indigo.css.js.map +1 -1
  276. package/components/textarea/themes/light/textarea.shared.css.js +1 -1
  277. package/components/textarea/themes/light/textarea.shared.css.js.map +1 -1
  278. package/components/textarea/themes/shared/textarea.bootstrap.css.js +1 -1
  279. package/components/textarea/themes/shared/textarea.bootstrap.css.js.map +1 -1
  280. package/components/textarea/themes/shared/textarea.fluent.css.js +1 -1
  281. package/components/textarea/themes/shared/textarea.fluent.css.js.map +1 -1
  282. package/components/textarea/themes/shared/textarea.indigo.css.js +1 -1
  283. package/components/textarea/themes/shared/textarea.indigo.css.js.map +1 -1
  284. package/components/textarea/themes/shared/textarea.material.css.js +1 -1
  285. package/components/textarea/themes/shared/textarea.material.css.js.map +1 -1
  286. package/components/textarea/themes/textarea.base.css.js +1 -1
  287. package/components/textarea/themes/textarea.base.css.js.map +1 -1
  288. package/components/tile-manager/tile-manager.js +5 -4
  289. package/components/tile-manager/tile-manager.js.map +1 -1
  290. package/components/tile-manager/tile.js +6 -5
  291. package/components/tile-manager/tile.js.map +1 -1
  292. package/components/tooltip/tooltip.d.ts +24 -9
  293. package/components/tooltip/tooltip.js +22 -19
  294. package/components/tooltip/tooltip.js.map +1 -1
  295. package/components/tree/tree-item.js +5 -3
  296. package/components/tree/tree-item.js.map +1 -1
  297. package/components/validation-container/validation-container.js +4 -11
  298. package/components/validation-container/validation-container.js.map +1 -1
  299. package/custom-elements.json +21432 -17768
  300. package/igniteui-webcomponents.css-data.json +1 -1
  301. package/igniteui-webcomponents.html-data.json +1 -1
  302. package/index.d.ts +4 -1
  303. package/index.js +1 -0
  304. package/index.js.map +1 -1
  305. package/package.json +3 -2
  306. package/web-types.json +2 -2
@@ -11,11 +11,22 @@ import { live } from 'lit/directives/live.js';
11
11
  import { watch } from '../common/decorators/watch.js';
12
12
  import { registerComponent } from '../common/definitions/register.js';
13
13
  import { createFormValueState, } from '../common/mixins/forms/form-value.js';
14
- import { isEmpty, partNameMap } from '../common/util.js';
14
+ import { partMap } from '../common/part-map.js';
15
+ import { isEmpty } from '../common/util.js';
15
16
  import IgcValidationContainerComponent from '../validation-container/validation-container.js';
16
17
  import { IgcMaskInputBaseComponent, } from './mask-input-base.js';
17
18
  import { maskValidators } from './validators.js';
18
19
  class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
20
+ constructor() {
21
+ super(...arguments);
22
+ this._formValue = createFormValueState(this, {
23
+ initialValue: '',
24
+ transformers: {
25
+ setFormValue: (value) => this._isRawMode ? value || null : this.maskedValue || null,
26
+ },
27
+ });
28
+ this.valueMode = 'raw';
29
+ }
19
30
  static register() {
20
31
  registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);
21
32
  }
@@ -49,16 +60,6 @@ class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
49
60
  this.maskedValue = this.parser.apply(this._formValue.value);
50
61
  }
51
62
  }
52
- constructor() {
53
- super();
54
- this.valueMode = 'raw';
55
- this._formValue = createFormValueState(this, {
56
- initialValue: '',
57
- transformers: {
58
- setFormValue: (value) => this._isRawMode ? value || null : this.maskedValue || null,
59
- },
60
- });
61
- }
62
63
  promptChange() {
63
64
  this.parser.prompt = this.prompt;
64
65
  if (this.value) {
@@ -125,7 +126,7 @@ class IgcMaskInputComponent extends IgcMaskInputBaseComponent {
125
126
  return html `
126
127
  <input
127
128
  type="text"
128
- part=${partNameMap(this.resolvePartNames('input'))}
129
+ part=${partMap(this.resolvePartNames('input'))}
129
130
  name=${ifDefined(this.name)}
130
131
  .value=${live(this.maskedValue)}
131
132
  .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}
@@ -1 +1 @@
1
- {"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n type FormValue,\n createFormValueState,\n} from '../common/mixins/forms/form-value.js';\nimport { isEmpty, partNameMap } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskRange,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register() {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override _formValue: FormValue<string>;\n\n protected get _isRawMode() {\n return this.valueMode === 'raw';\n }\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n * @attr value-mode\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n * @attr\n */\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this.maskedValue : value;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._validate();\n }\n\n /**\n * The mask pattern to apply on the input.\n * @attr\n */\n @property()\n public get mask(): string {\n return this._mask;\n }\n\n /** The mask pattern to apply on the input. */\n public set mask(value: string) {\n this._mask = value;\n this.parser.mask = value;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n constructor() {\n super();\n\n this._formValue = createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this.maskedValue || null,\n },\n });\n }\n\n @watch('prompt')\n protected promptChange() {\n this.parser.prompt = this.prompt;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._updateValidity();\n }\n\n protected async updateInput(string: string, range: MaskRange) {\n const { value, end } = this.parser.replace(\n this.maskedValue,\n string,\n range.start,\n range.end\n );\n\n this.maskedValue = value;\n this._formValue.setValueAndFormState(this.parser.parse(value));\n this._validate();\n this.requestUpdate();\n\n if (range.start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n await this.updateComplete;\n\n this.input.setSelectionRange(end, end);\n }\n\n protected handleDragEnter() {\n if (!this.focused && !this._formValue.value) {\n this.maskedValue = this.emptyMask;\n }\n }\n\n protected handleDragLeave() {\n if (!this.focused) {\n this.updateMaskedValue();\n }\n }\n\n protected async handleFocus() {\n this.focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this.maskedValue = this.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected handleBlur() {\n this.focused = false;\n this.updateMaskedValue();\n this.invalid = !this.checkValidity();\n }\n\n protected handleChange() {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n protected updateMaskedValue() {\n if (this.maskedValue === this.emptyMask) {\n this.maskedValue = '';\n }\n }\n\n protected override _updateSetRangeTextValue() {\n this.value = this.parser.parse(this.maskedValue);\n }\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partNameMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this.maskedValue)}\n .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragstart=${this.handleDragStart}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @cut=${this.handleCut}\n @change=${this.handleChange}\n @click=${this.handleClick}\n @compositionstart=${this.handleCompositionStart}\n @compositionend=${this.handleCompositionEnd}\n @input=${this.handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n aria-invalid=${this.invalid ? 'true' : 'false'}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
1
+ {"version":3,"file":"mask-input.js","sourceRoot":"","sources":["../../../src/components/mask-input/mask-input.ts"],"names":[],"mappings":"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","sourcesContent":["import { html, nothing } from 'lit';\nimport { property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { live } from 'lit/directives/live.js';\n\nimport { watch } from '../common/decorators/watch.js';\nimport { registerComponent } from '../common/definitions/register.js';\nimport {\n type FormValueOf,\n createFormValueState,\n} from '../common/mixins/forms/form-value.js';\nimport { partMap } from '../common/part-map.js';\nimport { isEmpty } from '../common/util.js';\nimport type { MaskInputValueMode } from '../types.js';\nimport IgcValidationContainerComponent from '../validation-container/validation-container.js';\nimport {\n IgcMaskInputBaseComponent,\n type MaskRange,\n} from './mask-input-base.js';\nimport { maskValidators } from './validators.js';\n\n/**\n * A masked input is an input field where a developer can control user input and format the visible value,\n * based on configurable rules\n *\n * @element igc-mask-input\n *\n * @slot prefix - Renders content before the input\n * @slot suffix - Renders content after the input\n * @slot helper-text - Renders content below the input\n * @slot value-missing - Renders content when the required validation fails.\n * @slot bad-input - Renders content when a required mask pattern validation fails.\n * @slot custom-error - Renders content when setCustomValidity(message) is set.\n * @slot invalid - Renders content when the component is in invalid state (validity.valid = false).\n *\n * @fires igcInput - Emitted when the control receives user input\n * @fires igcChange - Emitted when an alteration of the control's value is committed by the user\n *\n * @csspart container - The main wrapper that holds all main input elements\n * @csspart input - The native input element\n * @csspart label - The native label element\n * @csspart prefix - The prefix wrapper\n * @csspart suffix - The suffix wrapper\n * @csspart helper-text - The helper text wrapper\n */\nexport default class IgcMaskInputComponent extends IgcMaskInputBaseComponent {\n public static readonly tagName = 'igc-mask-input';\n\n /* blazorSuppress */\n public static register() {\n registerComponent(IgcMaskInputComponent, IgcValidationContainerComponent);\n }\n\n protected override get __validators() {\n return maskValidators;\n }\n\n protected override readonly _formValue: FormValueOf<string> =\n createFormValueState(this, {\n initialValue: '',\n transformers: {\n setFormValue: (value) =>\n this._isRawMode ? value || null : this.maskedValue || null,\n },\n });\n\n protected get _isRawMode() {\n return this.valueMode === 'raw';\n }\n\n /**\n * Dictates the behavior when retrieving the value of the control:\n *\n * - `raw` will return the clean user input.\n * - `withFormatting` will return the value with all literals and prompts.\n * @attr value-mode\n */\n @property({ attribute: 'value-mode' })\n public valueMode: MaskInputValueMode = 'raw';\n\n /**\n * The value of the input.\n *\n * Regardless of the currently set `value-mode`, an empty value will return an empty string.\n * @attr\n */\n public get value(): string {\n const value = this._formValue.value;\n\n if (this._isRawMode) {\n return value;\n }\n return value ? this.maskedValue : value;\n }\n\n /* @tsTwoWayProperty(true, \"igcChange\", \"detail\", false) */\n @property()\n public set value(string: string) {\n const value = string ?? '';\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._validate();\n }\n\n /**\n * The mask pattern to apply on the input.\n * @attr\n */\n @property()\n public get mask(): string {\n return this._mask;\n }\n\n /** The mask pattern to apply on the input. */\n public set mask(value: string) {\n this._mask = value;\n this.parser.mask = value;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n @watch('prompt')\n protected promptChange() {\n this.parser.prompt = this.prompt;\n if (this.value) {\n this.maskedValue = this.parser.apply(this._formValue.value);\n }\n }\n\n protected override _restoreDefaultValue(): void {\n const value = this.defaultValue as string;\n\n this.maskedValue = this.parser.apply(value);\n this.updateMaskedValue();\n this._formValue.setValueAndFormState(value);\n this._updateValidity();\n }\n\n protected async updateInput(string: string, range: MaskRange) {\n const { value, end } = this.parser.replace(\n this.maskedValue,\n string,\n range.start,\n range.end\n );\n\n this.maskedValue = value;\n this._formValue.setValueAndFormState(this.parser.parse(value));\n this._validate();\n this.requestUpdate();\n\n if (range.start !== this.mask.length) {\n this.emitEvent('igcInput', { detail: this.value });\n }\n await this.updateComplete;\n\n this.input.setSelectionRange(end, end);\n }\n\n protected handleDragEnter() {\n if (!this.focused && !this._formValue.value) {\n this.maskedValue = this.emptyMask;\n }\n }\n\n protected handleDragLeave() {\n if (!this.focused) {\n this.updateMaskedValue();\n }\n }\n\n protected async handleFocus() {\n this.focused = true;\n\n if (this.readOnly) {\n return;\n }\n\n if (!this._formValue.value) {\n // In case of empty value, select the whole mask\n this.maskedValue = this.emptyMask;\n\n await this.updateComplete;\n this.select();\n }\n }\n\n protected handleBlur() {\n this.focused = false;\n this.updateMaskedValue();\n this.invalid = !this.checkValidity();\n }\n\n protected handleChange() {\n this.emitEvent('igcChange', { detail: this.value });\n }\n\n protected updateMaskedValue() {\n if (this.maskedValue === this.emptyMask) {\n this.maskedValue = '';\n }\n }\n\n protected override _updateSetRangeTextValue() {\n this.value = this.parser.parse(this.maskedValue);\n }\n\n protected override renderInput() {\n return html`\n <input\n type=\"text\"\n part=${partMap(this.resolvePartNames('input'))}\n name=${ifDefined(this.name)}\n .value=${live(this.maskedValue)}\n .placeholder=${live(this.placeholder ?? this.parser.escapedMask)}\n ?readonly=${this.readOnly}\n ?disabled=${this.disabled}\n @dragenter=${this.handleDragEnter}\n @dragleave=${this.handleDragLeave}\n @dragstart=${this.handleDragStart}\n @blur=${this.handleBlur}\n @focus=${this.handleFocus}\n @cut=${this.handleCut}\n @change=${this.handleChange}\n @click=${this.handleClick}\n @compositionstart=${this.handleCompositionStart}\n @compositionend=${this.handleCompositionEnd}\n @input=${this.handleInput}\n aria-describedby=${ifDefined(\n isEmpty(this._helperText) ? nothing : 'helper-text'\n )}\n aria-invalid=${this.invalid ? 'true' : 'false'}\n @keydown=${this.handleKeydown}\n />\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'igc-mask-input': IgcMaskInputComponent;\n }\n}\n"]}
@@ -1,32 +1,118 @@
1
+ /** Options for the {@link MaskParser} */
1
2
  interface MaskOptions {
3
+ /**
4
+ * The mask format string (e.g., '00/00/0000' for dates, 'AAA-000' for custom IDs).
5
+ *
6
+ * Supported flags: a, A, C, L, 0, 9, #, &, ?.
7
+ *
8
+ * Use `'\'` to escape a flag character if it should be treated as a literal.
9
+ * @default 'CCCCCCCCCC'
10
+ */
2
11
  format: string;
12
+ /**
13
+ * The character used to prompt for input in unfilled mask positions.
14
+ * Must be a single character.
15
+ * @default '_'
16
+ */
3
17
  promptCharacter: string;
4
18
  }
19
+ /**
20
+ * Result type for the replace operation, containing the new masked value and the
21
+ * ideal cursor position.
22
+ */
23
+ type MaskReplaceResult = {
24
+ value: string;
25
+ end: number;
26
+ };
27
+ /**
28
+ * A class for parsing and applying masks to strings, typically for input fields.
29
+ * It handles mask definitions, literals, character validation, and cursor positioning.
30
+ */
5
31
  export declare class MaskParser {
6
- protected options: MaskOptions;
7
- constructor(options?: MaskOptions);
8
- protected literals: Map<number, string>;
32
+ protected readonly _options: MaskOptions;
33
+ /** Stores literal characters and their original positions in the mask (e.g., '(', ')', '-'). */
34
+ protected readonly _literals: Map<number, string>;
35
+ /** A Set of positions where literals occur in the `_escapedMask`. */
36
+ protected _literalPositions: Set<number>;
37
+ /** The mask format after processing escape characters */
9
38
  protected _escapedMask: string;
10
- get literalPositions(): number[];
39
+ /**
40
+ * Returns a set of the all the literal positions in the mask.
41
+ * These positions are fixed characters that are not part of the input.
42
+ */
43
+ get literalPositions(): Set<number>;
44
+ /**
45
+ * Returns the escaped mask string.
46
+ * This is the mask after processing any escape sequences.
47
+ */
11
48
  get escapedMask(): string;
49
+ /**
50
+ * Gets the unescaped mask string (the original format string).
51
+ * If the mask has no escape sequences, then `mask === escapedMask`.
52
+ */
12
53
  get mask(): string;
54
+ /**
55
+ * Sets the mask of the parser.
56
+ * When the mask is set, it triggers a re-parsing of the mask literals and escaped mask.
57
+ */
13
58
  set mask(value: string);
59
+ /**
60
+ * Gets the prompt character used for unfilled mask positions.
61
+ */
14
62
  get prompt(): string;
63
+ /**
64
+ * Sets the prompt character. Only the first character of the provided string is used.
65
+ */
15
66
  set prompt(value: string);
16
- protected parseMaskLiterals(): void;
17
- protected isPromptChar(char: string): boolean;
18
- protected replaceCharAt(string: string, pos: number, char: string): string;
19
- protected validate(char: string, maskedChar: string): boolean;
20
- protected getNonLiteralPositions(mask?: string): number[];
21
- protected getRequiredNonLiteralPositions(mask: string): number[];
67
+ constructor(options?: MaskOptions);
68
+ /**
69
+ * Parses the mask format string to identify literal characters and
70
+ * create the escaped mask. This method is called whenever the mask format changes.
71
+ */
72
+ protected _parseMaskLiterals(): void;
73
+ /**
74
+ * Gets an array of positions in the escaped mask that correspond to
75
+ * required input flags (e.g., '0', 'L') and are not literal characters.
76
+ *
77
+ * These positions must be filled for the masked string to be valid.
78
+ */
79
+ protected _getRequiredNonLiteralPositions(): number[];
80
+ /**
81
+ * Finds the closest non-literal position in the mask *before* the given start position.
82
+ * Useful for backward navigation (e.g., backspace).
83
+ *
84
+ * @remarks
85
+ * If no non-literal is found before `start`, return `start`.
86
+ */
22
87
  getPreviousNonLiteralPosition(start: number): number;
88
+ /**
89
+ * Finds the closest non-literal position in the mask *after* the given start position.
90
+ * Useful for forward navigation (e.g., arrow keys, delete key or initial cursor placement).
91
+ *
92
+ * @remarks
93
+ * If no non-literal is found after `start`, return `start`.
94
+ */
23
95
  getNextNonLiteralPosition(start: number): number;
24
- replace(maskString: string, value: string, start: number, end: number): {
25
- value: string;
26
- end: number;
27
- };
96
+ /**
97
+ * Replaces a segment of the masked string with new input, simulating typing or pasting.
98
+ * It handles clearing the selected range and inserting new characters according to the mask.
99
+ */
100
+ replace(maskString: string, value: string, start: number, end: number): MaskReplaceResult;
101
+ /**
102
+ * Parses the masked string, extracting only the valid input characters.
103
+ * This effectively "unmasks" the string, removing prompts and literals.
104
+ */
28
105
  parse(masked?: string): string;
106
+ /**
107
+ * Checks if the masked string is valid, specifically if all required mask positions are filled
108
+ * with valid, non-prompt characters.
109
+ */
29
110
  isValidString(input?: string): boolean;
111
+ /**
112
+ * Applies the mask format to an input string. This attempts to fit the input
113
+ * into the mask from left to right, filling valid positions and skipping invalid
114
+ * input characters.
115
+ */
30
116
  apply(input?: string): string;
31
117
  }
32
118
  export {};
@@ -1,17 +1,17 @@
1
- const FLAGS = new Set('aACL09#&?');
2
- const REGEX = new Map([
1
+ const MASK_FLAGS = new Set('aACL09#&?');
2
+ const MASK_REQUIRED_FLAGS = new Set('0#LA&');
3
+ const MASK_PATTERNS = new Map([
3
4
  ['C', /(?!^$)/u],
4
5
  ['&', /[^\p{Separator}]/u],
5
- ['a', /[\p{Letter}\d\p{Separator}]/u],
6
- ['A', /[\p{Letter}\d]/u],
6
+ ['a', /[\p{Letter}\p{Number}\p{Separator}]/u],
7
+ ['A', /[\p{Letter}\p{Number}]/u],
7
8
  ['?', /[\p{Letter}\p{Separator}]/u],
8
9
  ['L', /\p{Letter}/u],
9
- ['0', /\d/],
10
- ['9', /[\d\p{Separator}]/u],
11
- ['#', /[\d\-+]/],
10
+ ['0', /\p{Number}/u],
11
+ ['9', /[\p{Number}\p{Separator}]/u],
12
+ ['#', /[\p{Number}\-+]/u],
12
13
  ]);
13
- const REQUIRED = new Set('0#LA&');
14
- const replaceIMENumbers = (string) => {
14
+ function replaceIMENumbers(string) {
15
15
  return string.replace(/[0123456789]/g, (num) => ({
16
16
  '1': '1',
17
17
  '2': '2',
@@ -24,171 +24,188 @@ const replaceIMENumbers = (string) => {
24
24
  '9': '9',
25
25
  '0': '0',
26
26
  })[num]);
27
+ }
28
+ function validate(char, flag) {
29
+ return MASK_PATTERNS.get(flag)?.test(char) ?? false;
30
+ }
31
+ const MaskDefaultOptions = {
32
+ format: 'CCCCCCCCCC',
33
+ promptCharacter: '_',
27
34
  };
28
35
  export class MaskParser {
29
- constructor(options = { format: 'CCCCCCCCCC', promptCharacter: '_' }) {
30
- this.literals = new Map();
31
- this._escapedMask = '';
32
- this.options = options;
33
- this.parseMaskLiterals();
34
- }
35
36
  get literalPositions() {
36
- return Array.from(this.literals.keys());
37
+ return this._literalPositions;
37
38
  }
38
39
  get escapedMask() {
39
40
  return this._escapedMask;
40
41
  }
41
42
  get mask() {
42
- return this.options.format;
43
+ return this._options.format;
43
44
  }
44
45
  set mask(value) {
45
- this.options.format = value || this.options.format;
46
- this.parseMaskLiterals();
46
+ this._options.format = value || this._options.format;
47
+ this._parseMaskLiterals();
47
48
  }
48
49
  get prompt() {
49
- return this.options.promptCharacter;
50
+ return this._options.promptCharacter;
50
51
  }
51
52
  set prompt(value) {
52
- this.options.promptCharacter = value
53
+ this._options.promptCharacter = value
53
54
  ? value.substring(0, 1)
54
- : this.options.promptCharacter;
55
+ : this._options.promptCharacter;
55
56
  }
56
- parseMaskLiterals() {
57
- this.literals.clear();
58
- this._escapedMask = this.mask;
59
- for (let i = 0, j = 0; i < this.mask.length; i++, j++) {
60
- const [current, next] = [this.mask.charAt(i), this.mask.charAt(i + 1)];
61
- if (current === '\\' && FLAGS.has(next)) {
62
- this._escapedMask = this.replaceCharAt(this._escapedMask, j, '');
63
- this.literals.set(j, next);
57
+ constructor(options) {
58
+ this._literals = new Map();
59
+ this._literalPositions = new Set();
60
+ this._escapedMask = '';
61
+ this._options = { ...MaskDefaultOptions, ...options };
62
+ this._parseMaskLiterals();
63
+ }
64
+ _parseMaskLiterals() {
65
+ const mask = this.mask;
66
+ const length = mask.length;
67
+ const escapedMaskChars = [];
68
+ let currentPos = 0;
69
+ this._literals.clear();
70
+ for (let i = 0; i < length; i++) {
71
+ const [current, next] = [mask.charAt(i), mask.charAt(i + 1)];
72
+ if (current === '\\' && MASK_FLAGS.has(next)) {
73
+ this._literals.set(currentPos, next);
74
+ escapedMaskChars.push(next);
64
75
  i++;
65
76
  }
66
- else if (!FLAGS.has(current)) {
67
- this.literals.set(j, current);
77
+ else if (MASK_FLAGS.has(current)) {
78
+ escapedMaskChars.push(current);
68
79
  }
69
- }
70
- }
71
- isPromptChar(char) {
72
- return char === this.prompt;
73
- }
74
- replaceCharAt(string, pos, char) {
75
- return `${string.substring(0, pos)}${char}${string.substring(pos + 1)}`;
76
- }
77
- validate(char, maskedChar) {
78
- const regex = REGEX.get(maskedChar);
79
- return regex ? regex.test(char) : false;
80
- }
81
- getNonLiteralPositions(mask = '') {
82
- const positions = this.literalPositions;
83
- const result = [];
84
- const iter = Array.from(mask).entries();
85
- for (const [pos, _] of iter) {
86
- if (!positions.includes(pos)) {
87
- result.push(pos);
80
+ else {
81
+ this._literals.set(currentPos, current);
82
+ escapedMaskChars.push(current);
88
83
  }
84
+ currentPos++;
89
85
  }
90
- return result;
86
+ this._escapedMask = escapedMaskChars.join('');
87
+ this._literalPositions = new Set(this._literals.keys());
91
88
  }
92
- getRequiredNonLiteralPositions(mask) {
93
- const positions = this.literalPositions;
89
+ _getRequiredNonLiteralPositions() {
90
+ const literalPositions = this.literalPositions;
91
+ const escapedMask = this._escapedMask;
92
+ const length = escapedMask.length;
94
93
  const result = [];
95
- const iter = Array.from(mask).entries();
96
- for (const [pos, char] of iter) {
97
- if (REQUIRED.has(char) && !positions.includes(pos)) {
98
- result.push(pos);
94
+ for (let i = 0; i < length; i++) {
95
+ const char = escapedMask[i];
96
+ if (MASK_REQUIRED_FLAGS.has(char) && !literalPositions.has(i)) {
97
+ result.push(i);
99
98
  }
100
99
  }
101
100
  return result;
102
101
  }
103
102
  getPreviousNonLiteralPosition(start) {
104
- const positions = this.literalPositions;
103
+ const literalPositions = this.literalPositions;
105
104
  for (let i = start; i > 0; i--) {
106
- if (!positions.includes(i))
105
+ if (!literalPositions.has(i)) {
107
106
  return i;
107
+ }
108
108
  }
109
109
  return start;
110
110
  }
111
111
  getNextNonLiteralPosition(start) {
112
- const positions = this.literalPositions;
113
- for (let i = start; i < this._escapedMask.length; i++) {
114
- if (!positions.includes(i))
112
+ const literalPositions = this.literalPositions;
113
+ const length = this._escapedMask.length;
114
+ for (let i = start; i < length; i++) {
115
+ if (!literalPositions.has(i)) {
115
116
  return i;
117
+ }
116
118
  }
117
119
  return start;
118
120
  }
119
121
  replace(maskString, value, start, end) {
120
- let masked = maskString ?? '';
121
- const chars = Array.from(replaceIMENumbers(value));
122
- const positions = this.literalPositions;
123
- const final = Math.min(end, masked.length);
122
+ const literalPositions = this.literalPositions;
123
+ const escapedMask = this._escapedMask;
124
+ const length = this._escapedMask.length;
125
+ const prompt = this.prompt;
126
+ const endBoundary = Math.min(end, length);
127
+ const maskedChars = Array.from(maskString || this.apply(''));
128
+ const inputChars = Array.from(replaceIMENumbers(value));
129
+ const inputLength = inputChars.length;
130
+ for (let i = start; i < endBoundary; i++) {
131
+ if (!literalPositions.has(i)) {
132
+ maskedChars[i] = prompt;
133
+ }
134
+ }
124
135
  let cursor = start;
125
- for (let i = start; i < final || (chars.length && i < masked.length); i++) {
126
- if (positions.includes(i)) {
127
- if (chars[0] === masked[i]) {
128
- cursor = i + 1;
129
- chars.shift();
130
- }
136
+ let inputIndex = 0;
137
+ let maskPosition = start;
138
+ for (; maskPosition < length && inputIndex < inputLength; maskPosition++) {
139
+ if (literalPositions.has(maskPosition)) {
140
+ cursor = maskPosition + 1;
131
141
  continue;
132
142
  }
133
- if (chars[0] &&
134
- !this.validate(chars[0], this._escapedMask[i]) &&
135
- !this.isPromptChar(chars[0])) {
136
- break;
143
+ const char = inputChars[inputIndex];
144
+ if (validate(char, escapedMask[maskPosition]) && char !== prompt) {
145
+ maskedChars[maskPosition] = char;
146
+ cursor = maskPosition + 1;
147
+ inputIndex++;
137
148
  }
138
- let char = this.prompt;
139
- if (chars.length) {
140
- cursor = i + 1;
141
- char = chars.shift();
149
+ else {
150
+ inputIndex++;
151
+ maskPosition--;
142
152
  }
143
- masked = this.replaceCharAt(masked, i, char);
144
153
  }
145
- return { value: masked, end: cursor };
154
+ while (cursor < length && literalPositions.has(cursor)) {
155
+ cursor++;
156
+ }
157
+ return {
158
+ value: maskedChars.join(''),
159
+ end: cursor,
160
+ };
146
161
  }
147
162
  parse(masked = '') {
148
- const positions = this.literalPositions;
149
- const result = [];
150
- const iter = Array.from(masked).entries();
151
- for (const [pos, char] of iter) {
152
- !positions.includes(pos) && !this.isPromptChar(char)
153
- ? result.push(char)
154
- : result.push('');
163
+ const literalPositions = this.literalPositions;
164
+ const prompt = this.prompt;
165
+ const length = masked.length;
166
+ let result = '';
167
+ for (let i = 0; i < length; i++) {
168
+ const char = masked[i];
169
+ if (!literalPositions.has(i) && char !== prompt) {
170
+ result += char;
171
+ }
155
172
  }
156
- return result.join('');
173
+ return result;
157
174
  }
158
175
  isValidString(input = '') {
159
- const required = this.getRequiredNonLiteralPositions(this._escapedMask);
160
- if (required.length > this.parse(input).length) {
161
- return false;
162
- }
163
- return required.every((pos) => {
164
- const char = input.charAt(pos);
165
- return (this.validate(char, this._escapedMask.charAt(pos)) &&
166
- !this.isPromptChar(char));
176
+ const prompt = this.prompt;
177
+ return this._getRequiredNonLiteralPositions().every((position) => {
178
+ const char = input.charAt(position);
179
+ return (validate(char, this._escapedMask.charAt(position)) && char !== prompt);
167
180
  });
168
181
  }
169
182
  apply(input = '') {
170
- const output = new Array(this._escapedMask.length).fill(this.prompt);
171
- for (const [pos, char] of this.literals.entries()) {
172
- output[pos] = char;
183
+ const literals = this._literals;
184
+ const prompt = this.prompt;
185
+ const escapedMask = this._escapedMask;
186
+ const length = escapedMask.length;
187
+ const inputLength = input.length;
188
+ const result = new Array(escapedMask.length).fill(prompt);
189
+ for (const [position, literal] of literals.entries()) {
190
+ result[position] = literal;
173
191
  }
174
192
  if (!input) {
175
- return output.join('');
193
+ return result.join('');
176
194
  }
177
- const nonLiteralPositions = this.getNonLiteralPositions(this._escapedMask);
178
- const values = nonLiteralPositions.map((pos, index) => {
179
- const char = input.charAt(index);
180
- return !this.validate(char, this._escapedMask.charAt(pos)) &&
181
- !this.isPromptChar(char)
182
- ? this.prompt
183
- : char;
184
- });
185
- if (values.length > nonLiteralPositions.length) {
186
- values.splice(nonLiteralPositions.length);
187
- }
188
- for (const [position, char] of values.entries()) {
189
- output[nonLiteralPositions[position]] = char;
195
+ let inputIndex = 0;
196
+ for (let i = 0; i < length; i++) {
197
+ if (inputIndex >= inputLength) {
198
+ break;
199
+ }
200
+ if (literals.has(i)) {
201
+ continue;
202
+ }
203
+ if (validate(input.charAt(inputIndex), escapedMask.charAt(i))) {
204
+ result[i] = input.charAt(inputIndex);
205
+ }
206
+ inputIndex++;
190
207
  }
191
- return output.join('');
208
+ return result.join('');
192
209
  }
193
210
  }
194
211
  //# sourceMappingURL=mask-parser.js.map