@ui5/webcomponents-base 0.0.0-323968e1b → 0.0.0-4180fe799

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