@ui5/webcomponents-base 0.0.0-5f8ce9393 → 0.0.0-6cb3eb0db

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 (424) hide show
  1. package/.eslintignore +3 -0
  2. package/CHANGELOG.md +196 -0
  3. package/README.md +26 -1
  4. package/bundle.esm.js +18 -12
  5. package/dist/AssetRegistry.js +8 -6
  6. package/dist/Boot.js +43 -0
  7. package/dist/CustomElementsRegistry.js +39 -0
  8. package/dist/CustomElementsScope.js +108 -0
  9. package/dist/DOMObserver.js +65 -0
  10. package/dist/Device.js +58 -779
  11. package/dist/EventProvider.js +38 -26
  12. package/dist/FontFace.js +52 -7
  13. package/dist/InitialConfiguration.js +35 -10
  14. package/dist/Keys.js +248 -0
  15. package/dist/MediaRange.js +109 -0
  16. package/dist/PropertiesFileFormat.js +95 -0
  17. package/dist/Render.js +173 -0
  18. package/dist/RenderQueue.js +41 -17
  19. package/dist/RenderScheduler.js +24 -145
  20. package/dist/StaticArea.js +1 -39
  21. package/dist/StaticAreaItem.js +67 -50
  22. package/dist/SystemCSSVars.js +31 -0
  23. package/dist/Theming.js +3 -54
  24. package/dist/UI5Element.js +486 -318
  25. package/dist/UI5ElementMetadata.js +182 -19
  26. package/dist/asset-registries/Icons.js +118 -14
  27. package/dist/asset-registries/Illustrations.js +30 -0
  28. package/dist/asset-registries/LocaleData.js +97 -55
  29. package/dist/asset-registries/Themes.js +35 -32
  30. package/dist/asset-registries/i18n.js +80 -34
  31. package/dist/config/AnimationMode.js +11 -1
  32. package/dist/config/CalendarType.js +3 -7
  33. package/dist/config/Language.js +58 -2
  34. package/dist/config/Theme.js +2 -2
  35. package/dist/delegate/ItemNavigation.js +245 -172
  36. package/dist/delegate/ResizeHandler.js +78 -38
  37. package/dist/delegate/ScrollEnablement.js +101 -19
  38. package/dist/features/OpenUI5Support.js +57 -8
  39. package/dist/generated/AssetParameters.js +13 -0
  40. package/dist/getSharedResource.js +30 -0
  41. package/dist/i18nBundle.js +31 -10
  42. package/dist/isLegacyBrowser.js +3 -0
  43. package/dist/{Locale.js → locale/Locale.js} +0 -10
  44. package/dist/locale/RTLAwareRegistry.js +14 -0
  45. package/dist/locale/applyDirection.js +17 -0
  46. package/dist/locale/directionChange.js +32 -0
  47. package/dist/locale/getEffectiveDir.js +28 -0
  48. package/dist/locale/getLocale.js +41 -0
  49. package/dist/locale/languageChange.js +22 -0
  50. package/dist/locale/nextFallbackLocale.js +28 -0
  51. package/{src/util → dist/locale}/normalizeLocale.js +8 -31
  52. package/dist/renderer/LitRenderer.js +21 -4
  53. package/dist/renderer/executeTemplate.js +17 -0
  54. package/dist/resources/bundle.esm.js +20 -106
  55. package/dist/resources/bundle.esm.js.map +1 -1
  56. package/dist/sap/base/Log.js +241 -0
  57. package/dist/sap/base/assert.js +8 -0
  58. package/dist/sap/base/security/URLListValidator.js +148 -0
  59. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  60. package/dist/sap/base/util/now.js +7 -0
  61. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  62. package/dist/test-resources/assets/Themes.js +11 -5
  63. package/dist/test-resources/elements/Generic.js +1 -0
  64. package/dist/test-resources/elements/Parent.js +7 -2
  65. package/dist/test-resources/elements/WithStaticArea.js +77 -0
  66. package/dist/test-resources/pages/AllTestElements.html +5 -5
  67. package/dist/test-resources/pages/Configuration.html +0 -2
  68. package/dist/test-resources/pages/ConfigurationScript.html +1 -3
  69. package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
  70. package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
  71. package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
  72. package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
  73. package/dist/test-resources/pages/i18n.html +35 -0
  74. package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
  75. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  76. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  77. package/dist/test-resources/specs/CustomTheme.spec.js +7 -5
  78. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  79. package/dist/test-resources/specs/StaticArea.spec.js +78 -0
  80. package/dist/test-resources/specs/Theming.spec.js +9 -7
  81. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  82. package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
  83. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  84. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  85. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  86. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  87. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  88. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  89. package/dist/theming/CustomStyle.js +28 -7
  90. package/dist/theming/ThemeLoaded.js +22 -0
  91. package/dist/theming/applyTheme.js +78 -0
  92. package/dist/theming/createThemePropertiesStyleTag.js +20 -0
  93. package/dist/theming/getConstructableStyle.js +30 -0
  94. package/dist/theming/getEffectiveStyle.js +30 -0
  95. package/dist/theming/getStylesString.js +13 -0
  96. package/dist/theming/getThemeDesignerTheme.js +67 -0
  97. package/dist/thirdparty/_merge.js +32 -0
  98. package/dist/thirdparty/isPlainObject.js +18 -0
  99. package/dist/thirdparty/merge.js +10 -0
  100. package/dist/types/CSSColor.js +9 -0
  101. package/{src/dates → dist/types}/CalendarType.js +2 -2
  102. package/dist/types/DataType.js +13 -1
  103. package/dist/types/Float.js +14 -0
  104. package/dist/types/Integer.js +4 -0
  105. package/dist/types/InvisibleMessageMode.js +30 -0
  106. package/dist/types/ItemNavigationBehavior.js +2 -7
  107. package/dist/types/NavigationMode.js +1 -0
  108. package/dist/types/PopupState.js +1 -1
  109. package/dist/types/ValueState.js +2 -1
  110. package/dist/updateShadowRoot.js +26 -0
  111. package/dist/util/AriaLabelHelper.js +41 -0
  112. package/dist/util/Caret.js +45 -0
  113. package/dist/util/ColorConversion.js +370 -0
  114. package/dist/util/FocusableElements.js +25 -8
  115. package/dist/util/HTMLSanitizer.js +7 -0
  116. package/dist/util/InvisibleMessage.js +58 -0
  117. package/dist/util/PopupUtils.js +93 -0
  118. package/dist/util/SlotsHelper.js +43 -0
  119. package/dist/util/StringHelper.js +17 -2
  120. package/dist/util/TabbableElements.js +5 -2
  121. package/dist/util/arraysAreEqual.js +15 -0
  122. package/dist/util/clamp.js +12 -0
  123. package/dist/util/debounce.js +17 -0
  124. package/dist/util/detectNavigatorLanguage.js +3 -1
  125. package/dist/util/encodeCSS.js +24 -0
  126. package/dist/util/findNodeOwner.js +35 -0
  127. package/dist/util/getActiveElement.js +11 -0
  128. package/dist/util/getClassCopy.js +10 -0
  129. package/dist/util/getEffectiveContentDensity.js +5 -0
  130. package/dist/util/getFileExtension.js +21 -0
  131. package/dist/util/getSingletonElementInstance.js +13 -0
  132. package/dist/util/isElementInView.js +15 -0
  133. package/dist/util/isNodeHidden.js +1 -5
  134. package/dist/util/isNodeTabbable.js +4 -4
  135. package/dist/util/isValidPropertyName.js +11 -2
  136. package/dist/util/setToArray.js +10 -0
  137. package/hash.txt +1 -0
  138. package/index.js +1 -1
  139. package/lib/generate-asset-parameters/index.js +22 -0
  140. package/package-scripts.js +37 -17
  141. package/package.json +20 -12
  142. package/src/AssetRegistry.js +8 -6
  143. package/src/Boot.js +43 -0
  144. package/src/CustomElementsRegistry.js +39 -0
  145. package/src/CustomElementsScope.js +108 -0
  146. package/src/DOMObserver.js +65 -0
  147. package/src/Device.js +58 -779
  148. package/src/EventProvider.js +38 -26
  149. package/src/FontFace.js +52 -7
  150. package/src/InitialConfiguration.js +35 -10
  151. package/src/Keys.js +248 -0
  152. package/src/MediaRange.js +109 -0
  153. package/src/PropertiesFileFormat.js +95 -0
  154. package/src/Render.js +173 -0
  155. package/src/RenderQueue.js +41 -17
  156. package/src/RenderScheduler.js +24 -145
  157. package/src/StaticArea.js +1 -39
  158. package/src/StaticAreaItem.js +67 -50
  159. package/src/SystemCSSVars.js +31 -0
  160. package/src/Theming.js +3 -54
  161. package/src/UI5Element.js +486 -318
  162. package/src/UI5ElementMetadata.js +182 -19
  163. package/src/asset-registries/Icons.js +118 -14
  164. package/src/asset-registries/Illustrations.js +30 -0
  165. package/src/asset-registries/LocaleData.js +97 -55
  166. package/src/asset-registries/Themes.js +35 -32
  167. package/src/asset-registries/i18n.js +80 -34
  168. package/src/config/AnimationMode.js +11 -1
  169. package/src/config/CalendarType.js +3 -7
  170. package/src/config/Language.js +58 -2
  171. package/src/config/Theme.js +2 -2
  172. package/src/delegate/ItemNavigation.js +245 -172
  173. package/src/delegate/ResizeHandler.js +78 -38
  174. package/src/delegate/ScrollEnablement.js +101 -19
  175. package/src/features/OpenUI5Support.js +57 -8
  176. package/src/getSharedResource.js +30 -0
  177. package/src/i18nBundle.js +31 -10
  178. package/src/isLegacyBrowser.js +3 -0
  179. package/src/{Locale.js → locale/Locale.js} +0 -10
  180. package/src/locale/RTLAwareRegistry.js +14 -0
  181. package/src/locale/applyDirection.js +17 -0
  182. package/src/locale/directionChange.js +32 -0
  183. package/src/locale/getEffectiveDir.js +28 -0
  184. package/src/locale/getLocale.js +41 -0
  185. package/src/locale/languageChange.js +22 -0
  186. package/src/locale/nextFallbackLocale.js +28 -0
  187. package/{dist/util → src/locale}/normalizeLocale.js +8 -31
  188. package/src/renderer/LitRenderer.js +21 -4
  189. package/src/renderer/executeTemplate.js +17 -0
  190. package/src/theming/CustomStyle.js +28 -7
  191. package/src/theming/ThemeLoaded.js +22 -0
  192. package/src/theming/applyTheme.js +78 -0
  193. package/src/theming/createThemePropertiesStyleTag.js +20 -0
  194. package/src/theming/getConstructableStyle.js +30 -0
  195. package/src/theming/getEffectiveStyle.js +30 -0
  196. package/src/theming/getStylesString.js +13 -0
  197. package/src/theming/getThemeDesignerTheme.js +67 -0
  198. package/src/thirdparty/_merge.js +32 -0
  199. package/src/thirdparty/isPlainObject.js +18 -0
  200. package/src/thirdparty/merge.js +10 -0
  201. package/src/types/CSSColor.js +9 -0
  202. package/{dist/dates → src/types}/CalendarType.js +2 -2
  203. package/src/types/DataType.js +13 -1
  204. package/src/types/Float.js +14 -0
  205. package/src/types/Integer.js +4 -0
  206. package/src/types/InvisibleMessageMode.js +30 -0
  207. package/src/types/ItemNavigationBehavior.js +2 -7
  208. package/src/types/NavigationMode.js +1 -0
  209. package/src/types/PopupState.js +1 -1
  210. package/src/types/ValueState.js +2 -1
  211. package/src/updateShadowRoot.js +26 -0
  212. package/src/util/AriaLabelHelper.js +41 -0
  213. package/src/util/Caret.js +45 -0
  214. package/src/util/ColorConversion.js +370 -0
  215. package/src/util/FocusableElements.js +25 -8
  216. package/src/util/HTMLSanitizer.js +7 -0
  217. package/src/util/InvisibleMessage.js +58 -0
  218. package/src/util/PopupUtils.js +93 -0
  219. package/src/util/SlotsHelper.js +43 -0
  220. package/src/util/StringHelper.js +17 -2
  221. package/src/util/TabbableElements.js +5 -2
  222. package/src/util/arraysAreEqual.js +15 -0
  223. package/src/util/clamp.js +12 -0
  224. package/src/util/debounce.js +17 -0
  225. package/src/util/detectNavigatorLanguage.js +3 -1
  226. package/src/util/encodeCSS.js +24 -0
  227. package/src/util/findNodeOwner.js +35 -0
  228. package/src/util/getActiveElement.js +11 -0
  229. package/src/util/getClassCopy.js +10 -0
  230. package/src/util/getEffectiveContentDensity.js +5 -0
  231. package/src/util/getFileExtension.js +21 -0
  232. package/src/util/getSingletonElementInstance.js +13 -0
  233. package/src/util/isElementInView.js +15 -0
  234. package/src/util/isNodeHidden.js +1 -5
  235. package/src/util/isNodeTabbable.js +4 -4
  236. package/src/util/isValidPropertyName.js +11 -2
  237. package/src/util/setToArray.js +10 -0
  238. package/used-modules.txt +7 -0
  239. package/bundle.es5.js +0 -28
  240. package/dist/Assets.js +0 -2
  241. package/dist/CSS.js +0 -48
  242. package/dist/FormatSettings.js +0 -31
  243. package/dist/LocaleProvider.js +0 -34
  244. package/dist/ResourceLoaderOverrides.js +0 -38
  245. package/dist/SVGIconRegistry.js +0 -54
  246. package/dist/boot.js +0 -32
  247. package/dist/compatibility/DOMObserver.js +0 -62
  248. package/dist/compatibility/patchNodeValue.js +0 -24
  249. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  250. package/dist/dates/CalendarDate.js +0 -203
  251. package/dist/dates/CalendarUtils.js +0 -99
  252. package/dist/delegate/CustomResize.js +0 -78
  253. package/dist/delegate/NativeResize.js +0 -44
  254. package/dist/events/PseudoEvents.js +0 -58
  255. package/dist/features/browsersupport/Edge.js +0 -6
  256. package/dist/features/browsersupport/IE11.js +0 -41
  257. package/dist/features/calendar/Buddhist.js +0 -1
  258. package/dist/features/calendar/Islamic.js +0 -1
  259. package/dist/features/calendar/Japanese.js +0 -1
  260. package/dist/features/calendar/Persian.js +0 -1
  261. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar.json +0 -5598
  262. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar_EG.json +0 -5598
  263. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar_SA.json +0 -5598
  264. package/dist/generated/assets/cldr/sap/ui/core/cldr/bg.json +0 -4789
  265. package/dist/generated/assets/cldr/sap/ui/core/cldr/ca.json +0 -4801
  266. package/dist/generated/assets/cldr/sap/ui/core/cldr/cs.json +0 -5245
  267. package/dist/generated/assets/cldr/sap/ui/core/cldr/da.json +0 -4696
  268. package/dist/generated/assets/cldr/sap/ui/core/cldr/de.json +0 -4797
  269. package/dist/generated/assets/cldr/sap/ui/core/cldr/de_AT.json +0 -4798
  270. package/dist/generated/assets/cldr/sap/ui/core/cldr/de_CH.json +0 -4796
  271. package/dist/generated/assets/cldr/sap/ui/core/cldr/el.json +0 -4694
  272. package/dist/generated/assets/cldr/sap/ui/core/cldr/el_CY.json +0 -4694
  273. package/dist/generated/assets/cldr/sap/ui/core/cldr/en.json +0 -4777
  274. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_AU.json +0 -4769
  275. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_GB.json +0 -4778
  276. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_HK.json +0 -4784
  277. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_IE.json +0 -4778
  278. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_IN.json +0 -4779
  279. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_NZ.json +0 -4778
  280. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_PG.json +0 -4779
  281. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_SG.json +0 -4780
  282. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_ZA.json +0 -4779
  283. package/dist/generated/assets/cldr/sap/ui/core/cldr/es.json +0 -4719
  284. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_AR.json +0 -4721
  285. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_BO.json +0 -4720
  286. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_CL.json +0 -4721
  287. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_CO.json +0 -4721
  288. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_MX.json +0 -4722
  289. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_PE.json +0 -4720
  290. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_UY.json +0 -4722
  291. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_VE.json +0 -4721
  292. package/dist/generated/assets/cldr/sap/ui/core/cldr/et.json +0 -4776
  293. package/dist/generated/assets/cldr/sap/ui/core/cldr/fa.json +0 -4704
  294. package/dist/generated/assets/cldr/sap/ui/core/cldr/fi.json +0 -4816
  295. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr.json +0 -4788
  296. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_BE.json +0 -4788
  297. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_CA.json +0 -4782
  298. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_CH.json +0 -4806
  299. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_LU.json +0 -4788
  300. package/dist/generated/assets/cldr/sap/ui/core/cldr/he.json +0 -5133
  301. package/dist/generated/assets/cldr/sap/ui/core/cldr/hi.json +0 -4680
  302. package/dist/generated/assets/cldr/sap/ui/core/cldr/hr.json +0 -4910
  303. package/dist/generated/assets/cldr/sap/ui/core/cldr/hu.json +0 -4664
  304. package/dist/generated/assets/cldr/sap/ui/core/cldr/id.json +0 -4500
  305. package/dist/generated/assets/cldr/sap/ui/core/cldr/it.json +0 -4757
  306. package/dist/generated/assets/cldr/sap/ui/core/cldr/it_CH.json +0 -4757
  307. package/dist/generated/assets/cldr/sap/ui/core/cldr/ja.json +0 -4599
  308. package/dist/generated/assets/cldr/sap/ui/core/cldr/kk.json +0 -4537
  309. package/dist/generated/assets/cldr/sap/ui/core/cldr/ko.json +0 -4574
  310. package/dist/generated/assets/cldr/sap/ui/core/cldr/lt.json +0 -5234
  311. package/dist/generated/assets/cldr/sap/ui/core/cldr/lv.json +0 -4902
  312. package/dist/generated/assets/cldr/sap/ui/core/cldr/ms.json +0 -4352
  313. package/dist/generated/assets/cldr/sap/ui/core/cldr/nb.json +0 -4784
  314. package/dist/generated/assets/cldr/sap/ui/core/cldr/nl.json +0 -4790
  315. package/dist/generated/assets/cldr/sap/ui/core/cldr/nl_BE.json +0 -4790
  316. package/dist/generated/assets/cldr/sap/ui/core/cldr/pl.json +0 -5223
  317. package/dist/generated/assets/cldr/sap/ui/core/cldr/pt.json +0 -4703
  318. package/dist/generated/assets/cldr/sap/ui/core/cldr/pt_PT.json +0 -4753
  319. package/dist/generated/assets/cldr/sap/ui/core/cldr/ro.json +0 -4881
  320. package/dist/generated/assets/cldr/sap/ui/core/cldr/ru.json +0 -5157
  321. package/dist/generated/assets/cldr/sap/ui/core/cldr/ru_UA.json +0 -5157
  322. package/dist/generated/assets/cldr/sap/ui/core/cldr/sk.json +0 -5125
  323. package/dist/generated/assets/cldr/sap/ui/core/cldr/sl.json +0 -5105
  324. package/dist/generated/assets/cldr/sap/ui/core/cldr/sr.json +0 -4908
  325. package/dist/generated/assets/cldr/sap/ui/core/cldr/sv.json +0 -4818
  326. package/dist/generated/assets/cldr/sap/ui/core/cldr/th.json +0 -4633
  327. package/dist/generated/assets/cldr/sap/ui/core/cldr/tr.json +0 -4791
  328. package/dist/generated/assets/cldr/sap/ui/core/cldr/uk.json +0 -5126
  329. package/dist/generated/assets/cldr/sap/ui/core/cldr/vi.json +0 -4510
  330. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_CN.json +0 -4469
  331. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_HK.json +0 -4479
  332. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_SG.json +0 -4479
  333. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_TW.json +0 -4565
  334. package/dist/json-imports/LocaleData.js +0 -171
  335. package/dist/renderer/ifDefined.js +0 -21
  336. package/dist/resources/bundle.es5.js +0 -212
  337. package/dist/resources/bundle.es5.js.map +0 -1
  338. package/dist/shims/Core-shim.js +0 -52
  339. package/dist/shims/jquery-shim.js +0 -89
  340. package/dist/test-resources/dev-helpers/ExternalThemePresent.js +0 -3
  341. package/dist/theming/StyleInjection.js +0 -67
  342. package/dist/thirdparty/Array.from.js +0 -16
  343. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  344. package/dist/thirdparty/Array.prototype.find.js +0 -46
  345. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  346. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  347. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  348. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  349. package/dist/thirdparty/Number.isInteger.js +0 -5
  350. package/dist/thirdparty/Number.isNaN.js +0 -1
  351. package/dist/thirdparty/Number.parseInt.js +0 -1
  352. package/dist/thirdparty/Object.assign.js +0 -31
  353. package/dist/thirdparty/Object.entries.js +0 -11
  354. package/dist/thirdparty/Symbol.js +0 -2
  355. package/dist/thirdparty/WeakSet.js +0 -27
  356. package/dist/thirdparty/events-polyfills.js +0 -89
  357. package/dist/thirdparty/fetch.js +0 -1
  358. package/dist/thirdparty/template.js +0 -600
  359. package/dist/util/CSSTransformUtils.js +0 -90
  360. package/dist/webcomponentsjs/LICENSE.md +0 -19
  361. package/dist/webcomponentsjs/README.md +0 -229
  362. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  363. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  364. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  365. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  366. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  367. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  368. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  369. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  370. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  371. package/dist/webcomponentsjs/package.json +0 -46
  372. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  373. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  374. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  375. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  376. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  377. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  378. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  379. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  380. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  381. package/src/Assets.js +0 -2
  382. package/src/CSS.js +0 -48
  383. package/src/FormatSettings.js +0 -31
  384. package/src/LocaleProvider.js +0 -34
  385. package/src/ResourceLoaderOverrides.js +0 -38
  386. package/src/SVGIconRegistry.js +0 -54
  387. package/src/boot.js +0 -32
  388. package/src/compatibility/DOMObserver.js +0 -62
  389. package/src/compatibility/patchNodeValue.js +0 -24
  390. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  391. package/src/dates/CalendarDate.js +0 -203
  392. package/src/dates/CalendarUtils.js +0 -99
  393. package/src/delegate/CustomResize.js +0 -78
  394. package/src/delegate/NativeResize.js +0 -44
  395. package/src/events/PseudoEvents.js +0 -58
  396. package/src/features/browsersupport/Edge.js +0 -6
  397. package/src/features/browsersupport/IE11.js +0 -41
  398. package/src/features/calendar/Buddhist.js +0 -1
  399. package/src/features/calendar/Islamic.js +0 -1
  400. package/src/features/calendar/Japanese.js +0 -1
  401. package/src/features/calendar/Persian.js +0 -1
  402. package/src/json-imports/LocaleData.js +0 -171
  403. package/src/renderer/ifDefined.js +0 -21
  404. package/src/shims/Core-shim.js +0 -52
  405. package/src/shims/jquery-shim.js +0 -89
  406. package/src/theming/StyleInjection.js +0 -67
  407. package/src/thirdparty/Array.from.js +0 -16
  408. package/src/thirdparty/Array.prototype.fill.js +0 -44
  409. package/src/thirdparty/Array.prototype.find.js +0 -46
  410. package/src/thirdparty/Array.prototype.includes.js +0 -51
  411. package/src/thirdparty/Element.prototype.closest.js +0 -11
  412. package/src/thirdparty/Element.prototype.matches.js +0 -6
  413. package/src/thirdparty/Map.prototype.keys.js +0 -9
  414. package/src/thirdparty/Number.isInteger.js +0 -5
  415. package/src/thirdparty/Number.isNaN.js +0 -1
  416. package/src/thirdparty/Number.parseInt.js +0 -1
  417. package/src/thirdparty/Object.assign.js +0 -31
  418. package/src/thirdparty/Object.entries.js +0 -11
  419. package/src/thirdparty/Symbol.js +0 -2
  420. package/src/thirdparty/WeakSet.js +0 -27
  421. package/src/thirdparty/events-polyfills.js +0 -89
  422. package/src/thirdparty/fetch.js +0 -1
  423. package/src/thirdparty/template.js +0 -600
  424. package/src/util/CSSTransformUtils.js +0 -90
@@ -1,6 +1,8 @@
1
1
  import DataType from "./types/DataType.js";
2
2
  import isDescendantOf from "./util/isDescendantOf.js";
3
3
  import { camelToKebabCase } from "./util/StringHelper.js";
4
+ import { getSlottedElements } from "./util/SlotsHelper.js";
5
+ import { getEffectiveScopingSuffixForTag } from "./CustomElementsScope.js";
4
6
 
5
7
  /**
6
8
  *
@@ -12,6 +14,50 @@ class UI5ElementMetadata {
12
14
  this.metadata = metadata;
13
15
  }
14
16
 
17
+ getInitialState() {
18
+ if (Object.prototype.hasOwnProperty.call(this, "_initialState")) {
19
+ return this._initialState;
20
+ }
21
+
22
+ const initialState = {};
23
+ const slotsAreManaged = this.slotsAreManaged();
24
+
25
+ // Initialize properties
26
+ const props = this.getProperties();
27
+ for (const propName in props) { // eslint-disable-line
28
+ const propType = props[propName].type;
29
+ const propDefaultValue = props[propName].defaultValue;
30
+
31
+ if (propType === Boolean) {
32
+ initialState[propName] = false;
33
+
34
+ if (propDefaultValue !== undefined) {
35
+ console.warn("The 'defaultValue' metadata key is ignored for all booleans properties, they would be initialized with 'false' by default"); // eslint-disable-line
36
+ }
37
+ } else if (props[propName].multiple) {
38
+ initialState[propName] = [];
39
+ } else if (propType === Object) {
40
+ initialState[propName] = "defaultValue" in props[propName] ? props[propName].defaultValue : {};
41
+ } else if (propType === String) {
42
+ initialState[propName] = "defaultValue" in props[propName] ? props[propName].defaultValue : "";
43
+ } else {
44
+ initialState[propName] = propDefaultValue;
45
+ }
46
+ }
47
+
48
+ // Initialize slots
49
+ if (slotsAreManaged) {
50
+ const slots = this.getSlots();
51
+ for (const [slotName, slotData] of Object.entries(slots)) { // eslint-disable-line
52
+ const propertyName = slotData.propertyName || slotName;
53
+ initialState[propertyName] = [];
54
+ }
55
+ }
56
+
57
+ this._initialState = initialState;
58
+ return initialState;
59
+ }
60
+
15
61
  /**
16
62
  * Only intended for use by UI5Element.js
17
63
  * @protected
@@ -32,12 +78,44 @@ class UI5ElementMetadata {
32
78
  return validateSingleSlot(value, slotData);
33
79
  }
34
80
 
81
+ /**
82
+ * Returns the tag of the UI5 Element without the scope
83
+ * @public
84
+ */
85
+ getPureTag() {
86
+ return this.metadata.tag;
87
+ }
88
+
35
89
  /**
36
90
  * Returns the tag of the UI5 Element
37
91
  * @public
38
92
  */
39
93
  getTag() {
40
- return this.metadata.tag;
94
+ const pureTag = this.metadata.tag;
95
+ const suffix = getEffectiveScopingSuffixForTag(pureTag);
96
+ if (!suffix) {
97
+ return pureTag;
98
+ }
99
+
100
+ return `${pureTag}-${suffix}`;
101
+ }
102
+
103
+ /**
104
+ * Used to get the tag we need to register for backwards compatibility
105
+ * @public
106
+ */
107
+ getAltTag() {
108
+ const pureAltTag = this.metadata.altTag;
109
+ if (!pureAltTag) {
110
+ return;
111
+ }
112
+
113
+ const suffix = getEffectiveScopingSuffixForTag(pureAltTag);
114
+ if (!suffix) {
115
+ return pureAltTag;
116
+ }
117
+
118
+ return `${pureAltTag}-${suffix}`;
41
119
  }
42
120
 
43
121
  /**
@@ -48,7 +126,7 @@ class UI5ElementMetadata {
48
126
  */
49
127
  hasAttribute(propName) {
50
128
  const propData = this.getProperties()[propName];
51
- return propData.type !== Object && !propData.noAttribute;
129
+ return propData.type !== Object && !propData.noAttribute && !propData.multiple;
52
130
  }
53
131
 
54
132
  /**
@@ -77,6 +155,15 @@ class UI5ElementMetadata {
77
155
  return this.metadata.slots || {};
78
156
  }
79
157
 
158
+ /**
159
+ * Determines whether this UI5 Element has a default slot of type Node, therefore can slot text
160
+ * @returns {boolean}
161
+ */
162
+ canSlotText() {
163
+ const defaultSlot = this.getSlots().default;
164
+ return defaultSlot && defaultSlot.type === Node;
165
+ }
166
+
80
167
  /**
81
168
  * Determines whether this UI5 Element supports any slots
82
169
  * @public
@@ -85,6 +172,22 @@ class UI5ElementMetadata {
85
172
  return !!Object.entries(this.getSlots()).length;
86
173
  }
87
174
 
175
+ /**
176
+ * Determines whether this UI5 Element supports any slots with "individualSlots: true"
177
+ * @public
178
+ */
179
+ hasIndividualSlots() {
180
+ return this.slotsAreManaged() && Object.entries(this.getSlots()).some(([_slotName, slotData]) => slotData.individualSlots);
181
+ }
182
+
183
+ /**
184
+ * Determines whether this UI5 Element needs to invalidate if children are added/removed/changed
185
+ * @public
186
+ */
187
+ slotsAreManaged() {
188
+ return !!this.metadata.managedSlots;
189
+ }
190
+
88
191
  /**
89
192
  * Returns an object with key-value pairs of properties and their metadata definitions
90
193
  * @public
@@ -100,6 +203,82 @@ class UI5ElementMetadata {
100
203
  getEvents() {
101
204
  return this.metadata.events || {};
102
205
  }
206
+
207
+ /**
208
+ * Determines whether this UI5 Element has any translatable texts (needs to be invalidated upon language change)
209
+ * @returns {boolean}
210
+ */
211
+ isLanguageAware() {
212
+ return !!this.metadata.languageAware;
213
+ }
214
+
215
+ /**
216
+ * Matches a changed entity (property/slot) with the given name against the "invalidateOnChildChange" configuration
217
+ * and determines whether this should cause and invalidation
218
+ *
219
+ * @param slotName the name of the slot in which a child was changed
220
+ * @param type the type of change in the child: "property" or "slot"
221
+ * @param name the name of the property/slot that changed
222
+ * @returns {boolean}
223
+ */
224
+ shouldInvalidateOnChildChange(slotName, type, name) {
225
+ const config = this.getSlots()[slotName].invalidateOnChildChange;
226
+
227
+ // invalidateOnChildChange was not set in the slot metadata - by default child changes do not affect the component
228
+ if (config === undefined) {
229
+ return false;
230
+ }
231
+
232
+ // The simple format was used: invalidateOnChildChange: true/false;
233
+ if (typeof config === "boolean") {
234
+ return config;
235
+ }
236
+
237
+ // The complex format was used: invalidateOnChildChange: { properties, slots }
238
+ if (typeof config === "object") {
239
+ // A property was changed
240
+ if (type === "property") {
241
+ // The config object does not have a properties field
242
+ if (config.properties === undefined) {
243
+ return false;
244
+ }
245
+
246
+ // The config object has the short format: properties: true/false
247
+ if (typeof config.properties === "boolean") {
248
+ return config.properties;
249
+ }
250
+
251
+ // The config object has the complex format: properties: [...]
252
+ if (Array.isArray(config.properties)) {
253
+ return config.properties.includes(name);
254
+ }
255
+
256
+ throw new Error("Wrong format for invalidateOnChildChange.properties: boolean or array is expected");
257
+ }
258
+
259
+ // A slot was changed
260
+ if (type === "slot") {
261
+ // The config object does not have a slots field
262
+ if (config.slots === undefined) {
263
+ return false;
264
+ }
265
+
266
+ // The config object has the short format: slots: true/false
267
+ if (typeof config.slots === "boolean") {
268
+ return config.slots;
269
+ }
270
+
271
+ // The config object has the complex format: slots: [...]
272
+ if (Array.isArray(config.slots)) {
273
+ return config.slots.includes(name);
274
+ }
275
+
276
+ throw new Error("Wrong format for invalidateOnChildChange.slots: boolean or array is expected");
277
+ }
278
+ }
279
+
280
+ throw new Error("Wrong format for invalidateOnChildChange: boolean or object is expected");
281
+ }
103
282
  }
104
283
 
105
284
  const validateSingleProperty = (value, propData) => {
@@ -120,23 +299,7 @@ const validateSingleProperty = (value, propData) => {
120
299
  };
121
300
 
122
301
  const validateSingleSlot = (value, slotData) => {
123
- if (value === null) {
124
- return value;
125
- }
126
-
127
- const getSlottedNodes = el => {
128
- const isTag = el instanceof HTMLElement;
129
- const isSlot = isTag && el.localName === "slot";
130
-
131
- if (isSlot) {
132
- return el.assignedNodes({ flatten: true }).filter(item => item instanceof HTMLElement);
133
- }
134
-
135
- return [el];
136
- };
137
-
138
- const slottedNodes = getSlottedNodes(value);
139
- slottedNodes.forEach(el => {
302
+ value && getSlottedElements(value).forEach(el => {
140
303
  if (!(el instanceof slotData.type)) {
141
304
  throw new Error(`${el} is not of type ${slotData.type}`);
142
305
  }
@@ -1,24 +1,128 @@
1
- import { registerIcon, registerCollectionPromise } from "../SVGIconRegistry.js";
2
- import { fetchJsonOnce } from "../util/FetchHelper.js";
1
+ import getSharedResource from "../getSharedResource.js";
3
2
 
3
+ const loaders = new Map();
4
+ const registry = getSharedResource("SVGIcons.registry", new Map());
5
+ const iconCollectionPromises = getSharedResource("SVGIcons.promises", new Map());
6
+
7
+ const ICON_NOT_FOUND = "ICON_NOT_FOUND";
8
+ const DEFAULT_COLLECTION = "SAP-icons";
9
+
10
+ /**
11
+ * @deprecated
12
+ */
4
13
  const registerIconBundle = async (collectionName, bundleData) => {
5
- let resolveFn;
6
- const collectionFetched = new Promise(resolve => {
7
- resolveFn = resolve;
8
- });
9
- registerCollectionPromise(collectionName, collectionFetched);
14
+ throw new Error("This method has been removed. Use `registerIconLoader` instead.");
15
+ };
10
16
 
11
- if (typeof bundleData !== "object") { // not inlined from build -> fetch it
12
- bundleData = await fetchJsonOnce(bundleData);
17
+ const registerIconLoader = async (collectionName, loader) => {
18
+ loaders.set(collectionName, loader);
19
+ };
20
+
21
+ const _loadIconCollectionOnce = async collectionName => {
22
+ if (!iconCollectionPromises.has(collectionName)) {
23
+ if (!loaders.has(collectionName)) {
24
+ throw new Error(`No loader registered for the ${collectionName} icons collection. Probably you forgot to import the "AllIcons.js" module for the respective package.`);
25
+ }
26
+ const loadIcons = loaders.get(collectionName);
27
+ iconCollectionPromises.set(collectionName, loadIcons(collectionName));
13
28
  }
14
- fillRegistry(bundleData);
15
- resolveFn();
29
+
30
+ return iconCollectionPromises.get(collectionName);
16
31
  };
17
32
 
18
- const fillRegistry = bundleData => {
33
+ const _fillRegistry = bundleData => {
19
34
  Object.keys(bundleData.data).forEach(iconName => {
20
- registerIcon(iconName, { pathData: bundleData.data[iconName], accData: bundleData.accData[iconName], collection: bundleData.collection });
35
+ const iconData = bundleData.data[iconName];
36
+
37
+ registerIcon(iconName, {
38
+ pathData: iconData.path,
39
+ ltr: iconData.ltr,
40
+ accData: iconData.acc,
41
+ collection: bundleData.collection,
42
+ packageName: bundleData.packageName,
43
+ });
21
44
  });
22
45
  };
23
46
 
24
- export { registerIconBundle }; // eslint-disable-line
47
+ // set
48
+ const registerIcon = (name, { pathData, ltr, accData, collection, packageName } = {}) => { // eslint-disable-line
49
+ if (!collection) {
50
+ collection = DEFAULT_COLLECTION;
51
+ }
52
+
53
+ const key = `${collection}/${name}`;
54
+ registry.set(key, {
55
+ pathData,
56
+ ltr,
57
+ accData,
58
+ packageName,
59
+ });
60
+ };
61
+
62
+ const _parseName = name => {
63
+ // silently support ui5-compatible URIs
64
+ if (name.startsWith("sap-icon://")) {
65
+ name = name.replace("sap-icon://", "");
66
+ }
67
+
68
+ let collection;
69
+ [name, collection] = name.split("/").reverse();
70
+ collection = collection || DEFAULT_COLLECTION;
71
+ // hardcoded alias in case icon explorer is used, resolve `SAP-icons-TNT` to `tnt`
72
+ // aliases can be made a feature in the future if more collections need it or more aliases are needed.
73
+ if (collection === "SAP-icons-TNT") {
74
+ collection = "tnt";
75
+ }
76
+ // hardcoded alias in case icon explorer is used, resolve `BusinessSuiteInAppSymbols` to `business-suite`
77
+ // aliases can be made a feature in the future if more collections need it or more aliases are needed.
78
+ if (collection === "BusinessSuiteInAppSymbols") {
79
+ collection = "business-suite";
80
+ name = name.replace("icon-", "");
81
+ }
82
+ const registryKey = `${collection}/${name}`;
83
+ return { name, collection, registryKey };
84
+ };
85
+
86
+ const getIconDataSync = nameProp => {
87
+ const { registryKey } = _parseName(nameProp);
88
+ return registry.get(registryKey);
89
+ };
90
+
91
+ const getIconData = async nameProp => {
92
+ const { collection, registryKey } = _parseName(nameProp);
93
+
94
+ let iconData = ICON_NOT_FOUND;
95
+ try {
96
+ iconData = await _loadIconCollectionOnce(collection);
97
+ } catch (e) {
98
+ console.error(e.message); /* eslint-disable-line */
99
+ }
100
+
101
+ if (iconData === ICON_NOT_FOUND) {
102
+ return iconData;
103
+ }
104
+
105
+ if (!registry.has(registryKey)) {
106
+ // not filled by another await. many getters will await on the same loader, but fill only once
107
+ _fillRegistry(iconData);
108
+ }
109
+ return registry.get(registryKey);
110
+ };
111
+
112
+ // test page usage only
113
+ const _getRegisteredNames = async () => {
114
+ // fetch one icon of each collection to trigger the bundle load
115
+ await getIconData("edit");
116
+ await getIconData("tnt/arrow");
117
+ await getIconData("business-suite/3d");
118
+ return Array.from(registry.keys());
119
+ };
120
+
121
+ export {
122
+ registerIconBundle,
123
+ registerIconLoader,
124
+ getIconData,
125
+ getIconDataSync,
126
+ registerIcon,
127
+ _getRegisteredNames,
128
+ };
@@ -0,0 +1,30 @@
1
+ import getSharedResource from "../getSharedResource.js";
2
+
3
+ const registry = getSharedResource("SVGIllustration.registry", new Map());
4
+ const ILLUSTRATION_NOT_FOUND = "ILLUSTRATION_NOT_FOUND";
5
+
6
+ const registerIllustration = (name, { dialogSvg, sceneSvg, spotSvg, set, title, subtitle } = {}) => { // eslint-disable-line
7
+ registry.set(`${set}/${name}`, {
8
+ dialogSvg,
9
+ sceneSvg,
10
+ spotSvg,
11
+ title,
12
+ subtitle,
13
+ });
14
+ };
15
+
16
+ const getIllustrationDataSync = nameProp => {
17
+ let set = "fiori";
18
+
19
+ if (nameProp.startsWith("Tnt")) {
20
+ set = "tnt";
21
+ nameProp = nameProp.replace(/^Tnt/, "");
22
+ }
23
+
24
+ return registry.get(`${set}/${nameProp}`) || ILLUSTRATION_NOT_FOUND;
25
+ };
26
+
27
+ export {
28
+ getIllustrationDataSync,
29
+ registerIllustration,
30
+ };
@@ -1,17 +1,13 @@
1
- import { registerModuleContent } from "../ResourceLoaderOverrides.js";
2
- import { fetchJsonOnce } from "../util/FetchHelper.js";
1
+ import { attachLanguageChange } from "../locale/languageChange.js";
2
+ import getLocale from "../locale/getLocale.js";
3
+ import { DEFAULT_LOCALE, SUPPORTED_LOCALES } from "../generated/AssetParameters.js";
3
4
  import { getFeature } from "../FeaturesRegistry.js";
4
5
 
5
- const OpenUI5Support = getFeature("OpenUI5Support");
6
-
7
- const supportedLocales = ["ar", "ar_EG", "ar_SA", "bg", "ca", "cs", "da", "de", "de_AT", "de_CH", "el", "el_CY", "en", "en_AU", "en_GB", "en_HK", "en_IE", "en_IN", "en_NZ", "en_PG", "en_SG", "en_ZA", "es", "es_AR", "es_BO", "es_CL", "es_CO", "es_MX", "es_PE", "es_UY", "es_VE", "et", "fa", "fi", "fr", "fr_BE", "fr_CA", "fr_CH", "fr_LU", "he", "hi", "hr", "hu", "id", "it", "it_CH", "ja", "kk", "ko", "lt", "lv", "ms", "nb", "nl", "nl_BE", "pl", "pt", "pt_PT", "ro", "ru", "ru_UA", "sk", "sl", "sr", "sv", "th", "tr", "uk", "vi", "zh_CN", "zh_HK", "zh_SG", "zh_TW"];
8
-
9
- const cldrData = {};
10
- const cldrUrls = {};
11
-
12
- // externally configurable mapping function for resolving (localeId -> URL)
13
- // default implementation - ui5 CDN
14
- let cldrMappingFn = locale => `https://ui5.sap.com/1.60.2/resources/sap/ui/core/cldr/${locale}.json`;
6
+ const localeDataMap = new Map();
7
+ const loaders = new Map();
8
+ const cldrPromises = new Map();
9
+ const reportedErrors = new Set();
10
+ let warningShown = false;
15
11
 
16
12
  const M_ISO639_OLD_TO_NEW = {
17
13
  "iw": "he",
@@ -20,6 +16,13 @@ const M_ISO639_OLD_TO_NEW = {
20
16
  "sh": "sr",
21
17
  };
22
18
 
19
+ const _showAssetsWarningOnce = localeId => {
20
+ if (!warningShown) {
21
+ console.warn(`[LocaleData] Supported locale "${localeId}" not configured, import the "Assets.js" module from the webcomponents package you are using.`); /* eslint-disable-line */
22
+ warningShown = true;
23
+ }
24
+ };
25
+
23
26
  const calcLocale = (language, region, script) => {
24
27
  // normalize language and handle special cases
25
28
  language = (language && M_ISO639_OLD_TO_NEW[language]) || language;
@@ -38,71 +41,110 @@ const calcLocale = (language, region, script) => {
38
41
 
39
42
  // try language + region
40
43
  let localeId = `${language}_${region}`;
41
- if (!supportedLocales.includes(localeId)) {
42
- // fallback to language only
43
- localeId = language;
44
+ if (SUPPORTED_LOCALES.includes(localeId)) {
45
+ if (loaders.has(localeId)) {
46
+ // supported and has loader
47
+ return localeId;
48
+ }
49
+
50
+ // supported, no loader - fallback to default and warn
51
+ _showAssetsWarningOnce(localeId);
52
+ return DEFAULT_LOCALE;
53
+ }
54
+
55
+ // not supported, try language only
56
+ localeId = language;
57
+ if (SUPPORTED_LOCALES.includes(localeId)) {
58
+ if (loaders.has(localeId)) {
59
+ // supported and has loader
60
+ return localeId;
61
+ }
62
+
63
+ // supported, no loader - fallback to default and warn
64
+ _showAssetsWarningOnce(localeId);
65
+ return DEFAULT_LOCALE;
66
+ }
67
+
68
+ // not supported - fallback to default locale
69
+ return DEFAULT_LOCALE;
70
+ };
71
+
72
+ // internal set data
73
+ const setLocaleData = (localeId, content) => {
74
+ localeDataMap.set(localeId, content);
75
+ };
76
+
77
+ // external getSync
78
+ const getLocaleData = localeId => {
79
+ // if there is no loader, the default fallback was fetched and a warning was given - use default locale instead
80
+ if (!loaders.has(localeId)) {
81
+ localeId = DEFAULT_LOCALE;
44
82
  }
45
- if (!supportedLocales.includes(localeId)) {
46
- // fallback to english
47
- localeId = "en";
83
+
84
+ const content = localeDataMap.get(localeId);
85
+ if (!content) {
86
+ throw new Error(`CLDR data for locale ${localeId} is not loaded!`);
48
87
  }
49
88
 
50
- return localeId;
89
+ return content;
51
90
  };
52
91
 
92
+ // load bundle over the network once
93
+ const _loadCldrOnce = localeId => {
94
+ const loadCldr = loaders.get(localeId);
53
95
 
54
- const resolveMissingMappings = () => {
55
- if (!cldrMappingFn) {
56
- return;
96
+ if (!cldrPromises.get(localeId)) {
97
+ cldrPromises.set(localeId, loadCldr(localeId));
57
98
  }
58
99
 
59
- const missingLocales = supportedLocales.filter(locale => !cldrData[locale] && !cldrUrls[locale]);
60
- missingLocales.forEach(locale => {
61
- cldrUrls[locale] = cldrMappingFn(locale);
62
- });
100
+ return cldrPromises.get(localeId);
63
101
  };
64
102
 
103
+ // external getAsync
65
104
  const fetchCldr = async (language, region, script) => {
66
- resolveMissingMappings();
67
105
  const localeId = calcLocale(language, region, script);
68
106
 
69
- let cldrObj = cldrData[localeId];
70
- const url = cldrUrls[localeId];
71
-
72
- if (!cldrObj && OpenUI5Support) {
73
- cldrObj = OpenUI5Support.getLocaleDataObject();
107
+ // reuse OpenUI5 CLDR if present
108
+ const OpenUI5Support = getFeature("OpenUI5Support");
109
+ if (OpenUI5Support) {
110
+ const cldrContent = OpenUI5Support.getLocaleDataObject();
111
+ if (cldrContent) {
112
+ // only if openui5 actually returned valid content
113
+ setLocaleData(localeId, cldrContent);
114
+ return;
115
+ }
74
116
  }
75
117
 
76
- if (cldrObj) {
77
- // inlined from build or fetched independently
78
- registerModuleContent(`sap/ui/core/cldr/${localeId}.json`, cldrObj);
79
- } else if (url) {
80
- // fetch it
81
- const cldrContent = await fetchJsonOnce(url);
82
- registerModuleContent(`sap/ui/core/cldr/${localeId}.json`, cldrContent);
118
+ // fetch it
119
+ try {
120
+ const cldrContent = await _loadCldrOnce(localeId);
121
+ setLocaleData(localeId, cldrContent);
122
+ } catch (e) {
123
+ if (!reportedErrors.has(e.message)) {
124
+ reportedErrors.add(e.message);
125
+ console.error(e.message); /* eslint-disable-line */
126
+ }
83
127
  }
84
128
  };
85
129
 
86
- const registerCldr = (locale, url) => {
87
- cldrUrls[locale] = url;
88
- };
89
-
90
- const setCldrData = (locale, data) => {
91
- cldrData[locale] = data;
130
+ const registerLocaleDataLoader = (localeId, loader) => {
131
+ loaders.set(localeId, loader);
92
132
  };
93
133
 
94
- const getCldrData = locale => {
95
- return cldrData[locale];
96
- };
134
+ // register default loader for "en" from ui5 CDN (dev workflow without assets)
135
+ registerLocaleDataLoader("en", async runtimeLocaleId => {
136
+ return (await fetch(`https://ui5.sap.com/1.60.2/resources/sap/ui/core/cldr/en.json`)).json();
137
+ });
97
138
 
98
- const _registerMappingFunction = mappingFn => {
99
- cldrMappingFn = mappingFn;
100
- };
139
+ // When the language changes dynamically (the user calls setLanguage),
140
+ // re-fetch the required CDRD data.
141
+ attachLanguageChange(() => {
142
+ const locale = getLocale();
143
+ return fetchCldr(locale.getLanguage(), locale.getRegion(), locale.getScript());
144
+ });
101
145
 
102
146
  export {
147
+ registerLocaleDataLoader,
103
148
  fetchCldr,
104
- registerCldr,
105
- setCldrData,
106
- getCldrData,
107
- _registerMappingFunction,
149
+ getLocaleData,
108
150
  };