@ui5/webcomponents-base 0.0.0-32b659ddc → 0.0.0-35e2c9666

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 (454) hide show
  1. package/.eslintignore +4 -0
  2. package/CHANGELOG.md +329 -0
  3. package/README.md +26 -2
  4. package/bundle.esm.js +17 -12
  5. package/dist/AssetRegistry.js +8 -6
  6. package/dist/Boot.js +59 -0
  7. package/dist/CSP.js +59 -0
  8. package/dist/CustomElementsRegistry.js +95 -0
  9. package/dist/CustomElementsScope.js +108 -0
  10. package/dist/DOMObserver.js +65 -0
  11. package/dist/Device.js +69 -776
  12. package/dist/EventProvider.js +38 -26
  13. package/dist/FeaturesRegistry.js +4 -1
  14. package/dist/FontFace.js +19 -62
  15. package/dist/InitialConfiguration.js +46 -10
  16. package/dist/Keys.js +295 -0
  17. package/dist/ManagedStyles.js +83 -0
  18. package/dist/MediaRange.js +109 -0
  19. package/dist/PropertiesFileFormat.js +95 -0
  20. package/dist/Render.js +175 -0
  21. package/dist/RenderQueue.js +41 -17
  22. package/dist/RenderScheduler.js +24 -145
  23. package/dist/Runtimes.js +107 -0
  24. package/dist/StaticArea.js +1 -39
  25. package/dist/StaticAreaItem.js +61 -50
  26. package/dist/SystemCSSVars.js +10 -0
  27. package/dist/Theming.js +3 -54
  28. package/dist/UI5Element.js +454 -300
  29. package/dist/UI5ElementMetadata.js +182 -19
  30. package/dist/asset-registries/Icons.js +129 -14
  31. package/dist/asset-registries/Illustrations.js +30 -0
  32. package/dist/asset-registries/LocaleData.js +112 -56
  33. package/dist/asset-registries/Themes.js +35 -32
  34. package/dist/asset-registries/i18n.js +80 -33
  35. package/dist/assets-meta/IconCollectionsAlias.js +18 -0
  36. package/dist/config/AnimationMode.js +11 -1
  37. package/dist/config/CalendarType.js +3 -7
  38. package/dist/config/Language.js +58 -2
  39. package/dist/config/Theme.js +27 -2
  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 +101 -19
  46. package/dist/features/F6Navigation.js +108 -0
  47. package/dist/features/OpenUI5Support.js +56 -7
  48. package/dist/generated/AssetParameters.js +13 -0
  49. package/dist/generated/VersionInfo.js +10 -0
  50. package/dist/generated/css/FontFace.css.js +5 -0
  51. package/dist/generated/css/OverrideFontFace.css.js +5 -0
  52. package/dist/generated/css/SystemCSSVars.css.js +5 -0
  53. package/dist/getSharedResource.js +30 -0
  54. package/dist/i18nBundle.js +62 -11
  55. package/dist/isLegacyBrowser.js +3 -0
  56. package/dist/{Locale.js → locale/Locale.js} +0 -10
  57. package/dist/locale/RTLAwareRegistry.js +14 -0
  58. package/dist/locale/applyDirection.js +17 -0
  59. package/dist/locale/directionChange.js +32 -0
  60. package/dist/locale/getEffectiveDir.js +28 -0
  61. package/dist/locale/getLocale.js +41 -0
  62. package/dist/locale/languageChange.js +22 -0
  63. package/dist/locale/nextFallbackLocale.js +28 -0
  64. package/{src/util → dist/locale}/normalizeLocale.js +8 -31
  65. package/dist/renderer/LitRenderer.js +26 -7
  66. package/dist/renderer/directives/style-map.js +72 -0
  67. package/dist/renderer/executeTemplate.js +17 -0
  68. package/dist/resources/bundle.esm.js +20 -106
  69. package/dist/resources/bundle.esm.js.map +1 -1
  70. package/dist/sap/base/Log.js +241 -0
  71. package/dist/sap/base/assert.js +8 -0
  72. package/dist/sap/base/security/URLListValidator.js +148 -0
  73. package/dist/sap/base/security/encodeCSS.js +14 -0
  74. package/dist/sap/base/security/encodeXML.js +23 -0
  75. package/dist/sap/base/security/sanitizeHTML.js +16 -0
  76. package/dist/sap/base/strings/toHex.js +8 -0
  77. package/dist/sap/base/util/now.js +7 -0
  78. package/dist/sap/ui/thirdparty/caja-html-sanitizer.js +3585 -0
  79. package/dist/test-resources/assets/Themes.js +10 -6
  80. package/dist/test-resources/elements/Parent.js +6 -2
  81. package/dist/test-resources/elements/WithStaticArea.js +77 -0
  82. package/dist/test-resources/pages/AllTestElements.html +5 -3
  83. package/dist/test-resources/pages/Configuration.html +0 -2
  84. package/dist/test-resources/pages/ConfigurationScript.html +1 -3
  85. package/dist/test-resources/pages/assets/messagebundle_de.properties +1 -0
  86. package/dist/test-resources/pages/assets/messagebundle_en.properties +1 -0
  87. package/dist/test-resources/pages/assets/messagebundle_es.properties +1 -0
  88. package/dist/test-resources/pages/assets/messagebundle_fr.properties +1 -0
  89. package/dist/test-resources/pages/i18n.html +33 -0
  90. package/dist/test-resources/specs/ConfigurationChange.spec.js +11 -9
  91. package/dist/test-resources/specs/ConfigurationScript.spec.js +25 -23
  92. package/dist/test-resources/specs/ConfigurationURL.spec.js +65 -17
  93. package/dist/test-resources/specs/CustomTheme.spec.js +9 -7
  94. package/dist/test-resources/specs/EventProvider.spec.js +63 -0
  95. package/dist/test-resources/specs/StaticArea.spec.js +78 -0
  96. package/dist/test-resources/specs/Theming.spec.js +12 -10
  97. package/dist/test-resources/specs/UI5ElementInvalidation.js +54 -70
  98. package/dist/test-resources/specs/UI5ElementLifecycle.js +19 -14
  99. package/dist/test-resources/specs/UI5ElementListenForChildPropChanges.spec.js +25 -51
  100. package/dist/test-resources/specs/UI5ElementMetadataExt.js +9 -7
  101. package/dist/test-resources/specs/UI5ElementPropertyValidation.js +7 -5
  102. package/dist/test-resources/specs/UI5ElementPropsAndAttrs.spec.js +37 -35
  103. package/dist/test-resources/specs/UI5ElementShadowDOM.js +10 -8
  104. package/dist/test-resources/specs/UI5ElementSlots.js +10 -8
  105. package/dist/theming/CustomStyle.js +47 -6
  106. package/dist/theming/ThemeLoaded.js +22 -0
  107. package/dist/theming/applyTheme.js +79 -0
  108. package/dist/theming/getConstructableStyle.js +30 -0
  109. package/dist/theming/getEffectiveLinksHrefs.js +20 -0
  110. package/dist/theming/getEffectiveStyle.js +30 -0
  111. package/dist/theming/getStylesString.js +15 -0
  112. package/dist/theming/getThemeDesignerTheme.js +87 -0
  113. package/dist/theming/preloadLinks.js +23 -0
  114. package/dist/thirdparty/_merge.js +32 -0
  115. package/dist/thirdparty/isPlainObject.js +18 -0
  116. package/dist/thirdparty/merge.js +10 -0
  117. package/dist/types/CSSColor.js +9 -0
  118. package/{src/dates → dist/types}/CalendarType.js +2 -2
  119. package/dist/types/DataType.js +13 -1
  120. package/dist/types/Float.js +14 -0
  121. package/dist/types/Integer.js +4 -0
  122. package/dist/types/InvisibleMessageMode.js +30 -0
  123. package/dist/types/ItemNavigationBehavior.js +2 -7
  124. package/dist/types/NavigationMode.js +1 -0
  125. package/dist/types/PopupState.js +1 -1
  126. package/dist/types/ValueState.js +1 -1
  127. package/dist/updateShadowRoot.js +30 -0
  128. package/dist/util/AriaLabelHelper.js +41 -0
  129. package/dist/util/Caret.js +45 -0
  130. package/dist/util/ColorConversion.js +370 -0
  131. package/dist/util/FocusableElements.js +30 -11
  132. package/dist/util/HTMLSanitizer.js +7 -0
  133. package/dist/util/InvisibleMessage.js +60 -0
  134. package/dist/util/PopupUtils.js +93 -0
  135. package/dist/util/SlotsHelper.js +43 -0
  136. package/dist/util/TabbableElements.js +9 -2
  137. package/dist/util/arraysAreEqual.js +15 -0
  138. package/dist/util/clamp.js +12 -0
  139. package/dist/util/createLinkInHead.js +19 -0
  140. package/dist/util/debounce.js +17 -0
  141. package/dist/util/detectNavigatorLanguage.js +3 -1
  142. package/dist/util/escapeRegex.js +10 -0
  143. package/dist/util/findNodeOwner.js +35 -0
  144. package/dist/util/generateHighlightedMarkup.js +42 -0
  145. package/dist/util/getActiveElement.js +11 -0
  146. package/dist/util/getClassCopy.js +10 -0
  147. package/dist/util/getEffectiveContentDensity.js +5 -0
  148. package/dist/util/getFileExtension.js +21 -0
  149. package/dist/util/getSingletonElementInstance.js +13 -0
  150. package/dist/util/isElementInView.js +15 -0
  151. package/dist/util/isNodeHidden.js +1 -5
  152. package/dist/util/isNodeTabbable.js +4 -4
  153. package/dist/util/isValidPropertyName.js +11 -2
  154. package/dist/util/setToArray.js +10 -0
  155. package/hash.txt +1 -0
  156. package/index.js +1 -1
  157. package/lib/generate-asset-parameters/index.js +21 -0
  158. package/lib/generate-styles/index.js +18 -0
  159. package/lib/generate-version-info/index.js +27 -0
  160. package/package-scripts.js +38 -18
  161. package/package.json +19 -13
  162. package/src/AssetRegistry.js +8 -6
  163. package/src/Boot.js +59 -0
  164. package/src/CSP.js +59 -0
  165. package/src/CustomElementsRegistry.js +95 -0
  166. package/src/CustomElementsScope.js +108 -0
  167. package/src/DOMObserver.js +65 -0
  168. package/src/Device.js +69 -776
  169. package/src/EventProvider.js +38 -26
  170. package/src/FeaturesRegistry.js +4 -1
  171. package/src/FontFace.js +19 -62
  172. package/src/InitialConfiguration.js +46 -10
  173. package/src/Keys.js +295 -0
  174. package/src/ManagedStyles.js +83 -0
  175. package/src/MediaRange.js +109 -0
  176. package/src/PropertiesFileFormat.js +95 -0
  177. package/src/Render.js +175 -0
  178. package/src/RenderQueue.js +41 -17
  179. package/src/RenderScheduler.js +24 -145
  180. package/src/Runtimes.js +107 -0
  181. package/src/StaticArea.js +1 -39
  182. package/src/StaticAreaItem.js +61 -50
  183. package/src/SystemCSSVars.js +10 -0
  184. package/src/Theming.js +3 -54
  185. package/src/UI5Element.js +454 -300
  186. package/src/UI5ElementMetadata.js +182 -19
  187. package/src/asset-registries/Icons.js +129 -14
  188. package/src/asset-registries/Illustrations.js +30 -0
  189. package/src/asset-registries/LocaleData.js +112 -56
  190. package/src/asset-registries/Themes.js +35 -32
  191. package/src/asset-registries/i18n.js +80 -33
  192. package/src/assets-meta/IconCollectionsAlias.js +18 -0
  193. package/src/config/AnimationMode.js +11 -1
  194. package/src/config/CalendarType.js +3 -7
  195. package/src/config/Language.js +58 -2
  196. package/src/config/Theme.js +27 -2
  197. package/src/css/FontFace.css +45 -0
  198. package/src/css/OverrideFontFace.css +32 -0
  199. package/src/css/SystemCSSVars.css +17 -0
  200. package/src/delegate/ItemNavigation.js +245 -172
  201. package/src/delegate/ResizeHandler.js +78 -38
  202. package/src/delegate/ScrollEnablement.js +101 -19
  203. package/src/features/F6Navigation.js +108 -0
  204. package/src/features/OpenUI5Support.js +56 -7
  205. package/src/getSharedResource.js +30 -0
  206. package/src/i18nBundle.js +62 -11
  207. package/src/isLegacyBrowser.js +3 -0
  208. package/src/{Locale.js → locale/Locale.js} +0 -10
  209. package/src/locale/RTLAwareRegistry.js +14 -0
  210. package/src/locale/applyDirection.js +17 -0
  211. package/src/locale/directionChange.js +32 -0
  212. package/src/locale/getEffectiveDir.js +28 -0
  213. package/src/locale/getLocale.js +41 -0
  214. package/src/locale/languageChange.js +22 -0
  215. package/src/locale/nextFallbackLocale.js +28 -0
  216. package/{dist/util → src/locale}/normalizeLocale.js +8 -31
  217. package/src/renderer/LitRenderer.js +26 -7
  218. package/src/renderer/directives/style-map.js +72 -0
  219. package/src/renderer/executeTemplate.js +17 -0
  220. package/src/theming/CustomStyle.js +47 -6
  221. package/src/theming/ThemeLoaded.js +22 -0
  222. package/src/theming/applyTheme.js +79 -0
  223. package/src/theming/getConstructableStyle.js +30 -0
  224. package/src/theming/getEffectiveLinksHrefs.js +20 -0
  225. package/src/theming/getEffectiveStyle.js +30 -0
  226. package/src/theming/getStylesString.js +15 -0
  227. package/src/theming/getThemeDesignerTheme.js +87 -0
  228. package/src/theming/preloadLinks.js +23 -0
  229. package/src/thirdparty/_merge.js +32 -0
  230. package/src/thirdparty/isPlainObject.js +18 -0
  231. package/src/thirdparty/merge.js +10 -0
  232. package/src/types/CSSColor.js +9 -0
  233. package/{dist/dates → src/types}/CalendarType.js +2 -2
  234. package/src/types/DataType.js +13 -1
  235. package/src/types/Float.js +14 -0
  236. package/src/types/Integer.js +4 -0
  237. package/src/types/InvisibleMessageMode.js +30 -0
  238. package/src/types/ItemNavigationBehavior.js +2 -7
  239. package/src/types/NavigationMode.js +1 -0
  240. package/src/types/PopupState.js +1 -1
  241. package/src/types/ValueState.js +1 -1
  242. package/src/updateShadowRoot.js +30 -0
  243. package/src/util/AriaLabelHelper.js +41 -0
  244. package/src/util/Caret.js +45 -0
  245. package/src/util/ColorConversion.js +370 -0
  246. package/src/util/FocusableElements.js +30 -11
  247. package/src/util/HTMLSanitizer.js +7 -0
  248. package/src/util/InvisibleMessage.js +60 -0
  249. package/src/util/PopupUtils.js +93 -0
  250. package/src/util/SlotsHelper.js +43 -0
  251. package/src/util/TabbableElements.js +9 -2
  252. package/src/util/arraysAreEqual.js +15 -0
  253. package/src/util/clamp.js +12 -0
  254. package/src/util/createLinkInHead.js +19 -0
  255. package/src/util/debounce.js +17 -0
  256. package/src/util/detectNavigatorLanguage.js +3 -1
  257. package/src/util/escapeRegex.js +10 -0
  258. package/src/util/findNodeOwner.js +35 -0
  259. package/src/util/generateHighlightedMarkup.js +42 -0
  260. package/src/util/getActiveElement.js +11 -0
  261. package/src/util/getClassCopy.js +10 -0
  262. package/src/util/getEffectiveContentDensity.js +5 -0
  263. package/src/util/getFileExtension.js +21 -0
  264. package/src/util/getSingletonElementInstance.js +13 -0
  265. package/src/util/isElementInView.js +15 -0
  266. package/src/util/isNodeHidden.js +1 -5
  267. package/src/util/isNodeTabbable.js +4 -4
  268. package/src/util/isValidPropertyName.js +11 -2
  269. package/src/util/setToArray.js +10 -0
  270. package/used-modules.txt +10 -0
  271. package/bundle.es5.js +0 -28
  272. package/dist/Assets.js +0 -2
  273. package/dist/CSS.js +0 -48
  274. package/dist/FormatSettings.js +0 -31
  275. package/dist/LocaleProvider.js +0 -34
  276. package/dist/ResourceLoaderOverrides.js +0 -38
  277. package/dist/SVGIconRegistry.js +0 -54
  278. package/dist/boot.js +0 -32
  279. package/dist/compatibility/DOMObserver.js +0 -62
  280. package/dist/compatibility/patchNodeValue.js +0 -24
  281. package/dist/compatibility/whenPolyfillLoaded.js +0 -26
  282. package/dist/dates/CalendarDate.js +0 -203
  283. package/dist/dates/CalendarUtils.js +0 -99
  284. package/dist/delegate/CustomResize.js +0 -78
  285. package/dist/delegate/NativeResize.js +0 -44
  286. package/dist/events/PseudoEvents.js +0 -58
  287. package/dist/features/browsersupport/Edge.js +0 -6
  288. package/dist/features/browsersupport/IE11.js +0 -41
  289. package/dist/features/calendar/Buddhist.js +0 -1
  290. package/dist/features/calendar/Islamic.js +0 -1
  291. package/dist/features/calendar/Japanese.js +0 -1
  292. package/dist/features/calendar/Persian.js +0 -1
  293. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar.json +0 -5906
  294. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar_EG.json +0 -5906
  295. package/dist/generated/assets/cldr/sap/ui/core/cldr/ar_SA.json +0 -5906
  296. package/dist/generated/assets/cldr/sap/ui/core/cldr/bg.json +0 -4979
  297. package/dist/generated/assets/cldr/sap/ui/core/cldr/ca.json +0 -4996
  298. package/dist/generated/assets/cldr/sap/ui/core/cldr/cs.json +0 -5498
  299. package/dist/generated/assets/cldr/sap/ui/core/cldr/da.json +0 -4888
  300. package/dist/generated/assets/cldr/sap/ui/core/cldr/de.json +0 -4916
  301. package/dist/generated/assets/cldr/sap/ui/core/cldr/de_AT.json +0 -4917
  302. package/dist/generated/assets/cldr/sap/ui/core/cldr/de_CH.json +0 -4915
  303. package/dist/generated/assets/cldr/sap/ui/core/cldr/el.json +0 -4883
  304. package/dist/generated/assets/cldr/sap/ui/core/cldr/el_CY.json +0 -4883
  305. package/dist/generated/assets/cldr/sap/ui/core/cldr/en.json +0 -4970
  306. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_AU.json +0 -4962
  307. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_GB.json +0 -4971
  308. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_HK.json +0 -4977
  309. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_IE.json +0 -4971
  310. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_IN.json +0 -4972
  311. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_NZ.json +0 -4971
  312. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_PG.json +0 -4972
  313. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_SG.json +0 -4973
  314. package/dist/generated/assets/cldr/sap/ui/core/cldr/en_ZA.json +0 -4972
  315. package/dist/generated/assets/cldr/sap/ui/core/cldr/es.json +0 -4912
  316. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_AR.json +0 -4914
  317. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_BO.json +0 -4913
  318. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_CL.json +0 -4914
  319. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_CO.json +0 -4913
  320. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_MX.json +0 -4915
  321. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_PE.json +0 -4913
  322. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_UY.json +0 -4915
  323. package/dist/generated/assets/cldr/sap/ui/core/cldr/es_VE.json +0 -4914
  324. package/dist/generated/assets/cldr/sap/ui/core/cldr/et.json +0 -4967
  325. package/dist/generated/assets/cldr/sap/ui/core/cldr/fa.json +0 -4883
  326. package/dist/generated/assets/cldr/sap/ui/core/cldr/fi.json +0 -5008
  327. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr.json +0 -4979
  328. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_BE.json +0 -4979
  329. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_CA.json +0 -4973
  330. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_CH.json +0 -4997
  331. package/dist/generated/assets/cldr/sap/ui/core/cldr/fr_LU.json +0 -4979
  332. package/dist/generated/assets/cldr/sap/ui/core/cldr/he.json +0 -5378
  333. package/dist/generated/assets/cldr/sap/ui/core/cldr/hi.json +0 -4829
  334. package/dist/generated/assets/cldr/sap/ui/core/cldr/hr.json +0 -4919
  335. package/dist/generated/assets/cldr/sap/ui/core/cldr/hu.json +0 -4856
  336. package/dist/generated/assets/cldr/sap/ui/core/cldr/id.json +0 -4658
  337. package/dist/generated/assets/cldr/sap/ui/core/cldr/it.json +0 -4950
  338. package/dist/generated/assets/cldr/sap/ui/core/cldr/it_CH.json +0 -4950
  339. package/dist/generated/assets/cldr/sap/ui/core/cldr/ja.json +0 -4830
  340. package/dist/generated/assets/cldr/sap/ui/core/cldr/kk.json +0 -4725
  341. package/dist/generated/assets/cldr/sap/ui/core/cldr/ko.json +0 -4738
  342. package/dist/generated/assets/cldr/sap/ui/core/cldr/lt.json +0 -5481
  343. package/dist/generated/assets/cldr/sap/ui/core/cldr/lv.json +0 -5112
  344. package/dist/generated/assets/cldr/sap/ui/core/cldr/ms.json +0 -4515
  345. package/dist/generated/assets/cldr/sap/ui/core/cldr/nb.json +0 -4977
  346. package/dist/generated/assets/cldr/sap/ui/core/cldr/nl.json +0 -4884
  347. package/dist/generated/assets/cldr/sap/ui/core/cldr/nl_BE.json +0 -4884
  348. package/dist/generated/assets/cldr/sap/ui/core/cldr/pl.json +0 -5176
  349. package/dist/generated/assets/cldr/sap/ui/core/cldr/pt.json +0 -4805
  350. package/dist/generated/assets/cldr/sap/ui/core/cldr/pt_PT.json +0 -4940
  351. package/dist/generated/assets/cldr/sap/ui/core/cldr/ro.json +0 -5090
  352. package/dist/generated/assets/cldr/sap/ui/core/cldr/ru.json +0 -5407
  353. package/dist/generated/assets/cldr/sap/ui/core/cldr/ru_UA.json +0 -5407
  354. package/dist/generated/assets/cldr/sap/ui/core/cldr/sk.json +0 -5370
  355. package/dist/generated/assets/cldr/sap/ui/core/cldr/sl.json +0 -5340
  356. package/dist/generated/assets/cldr/sap/ui/core/cldr/sr.json +0 -5126
  357. package/dist/generated/assets/cldr/sap/ui/core/cldr/sv.json +0 -5011
  358. package/dist/generated/assets/cldr/sap/ui/core/cldr/th.json +0 -4797
  359. package/dist/generated/assets/cldr/sap/ui/core/cldr/tr.json +0 -4979
  360. package/dist/generated/assets/cldr/sap/ui/core/cldr/uk.json +0 -5353
  361. package/dist/generated/assets/cldr/sap/ui/core/cldr/vi.json +0 -4673
  362. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_CN.json +0 -4632
  363. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_HK.json +0 -4640
  364. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_SG.json +0 -4640
  365. package/dist/generated/assets/cldr/sap/ui/core/cldr/zh_TW.json +0 -4728
  366. package/dist/json-imports/LocaleData.js +0 -171
  367. package/dist/renderer/ifDefined.js +0 -21
  368. package/dist/resources/bundle.es5.js +0 -212
  369. package/dist/resources/bundle.es5.js.map +0 -1
  370. package/dist/shims/Core-shim.js +0 -53
  371. package/dist/test-resources/dev-helpers/ExternalThemePresent.js +0 -3
  372. package/dist/theming/StyleInjection.js +0 -67
  373. package/dist/thirdparty/Array.from.js +0 -16
  374. package/dist/thirdparty/Array.prototype.fill.js +0 -44
  375. package/dist/thirdparty/Array.prototype.find.js +0 -46
  376. package/dist/thirdparty/Array.prototype.includes.js +0 -51
  377. package/dist/thirdparty/Element.prototype.closest.js +0 -11
  378. package/dist/thirdparty/Element.prototype.matches.js +0 -6
  379. package/dist/thirdparty/Map.prototype.keys.js +0 -9
  380. package/dist/thirdparty/Number.isInteger.js +0 -5
  381. package/dist/thirdparty/Number.isNaN.js +0 -1
  382. package/dist/thirdparty/Number.parseInt.js +0 -1
  383. package/dist/thirdparty/Object.assign.js +0 -31
  384. package/dist/thirdparty/Object.entries.js +0 -11
  385. package/dist/thirdparty/Symbol.js +0 -2
  386. package/dist/thirdparty/WeakSet.js +0 -27
  387. package/dist/thirdparty/events-polyfills.js +0 -89
  388. package/dist/thirdparty/fetch.js +0 -1
  389. package/dist/thirdparty/template.js +0 -600
  390. package/dist/util/CSSTransformUtils.js +0 -90
  391. package/dist/webcomponentsjs/LICENSE.md +0 -19
  392. package/dist/webcomponentsjs/README.md +0 -229
  393. package/dist/webcomponentsjs/bundles/webcomponents-ce.js +0 -63
  394. package/dist/webcomponentsjs/bundles/webcomponents-ce.js.map +0 -1
  395. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js +0 -297
  396. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce-pf.js.map +0 -1
  397. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js +0 -208
  398. package/dist/webcomponentsjs/bundles/webcomponents-sd-ce.js.map +0 -1
  399. package/dist/webcomponentsjs/bundles/webcomponents-sd.js +0 -166
  400. package/dist/webcomponentsjs/bundles/webcomponents-sd.js.map +0 -1
  401. package/dist/webcomponentsjs/custom-elements-es5-adapter.js +0 -15
  402. package/dist/webcomponentsjs/package.json +0 -46
  403. package/dist/webcomponentsjs/src/entrypoints/custom-elements-es5-adapter-index.js +0 -16
  404. package/dist/webcomponentsjs/src/entrypoints/webcomponents-bundle-index.js +0 -53
  405. package/dist/webcomponentsjs/src/entrypoints/webcomponents-ce-index.js +0 -17
  406. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-index.js +0 -19
  407. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-ce-pf-index.js +0 -28
  408. package/dist/webcomponentsjs/src/entrypoints/webcomponents-sd-index.js +0 -18
  409. package/dist/webcomponentsjs/webcomponents-bundle.js +0 -298
  410. package/dist/webcomponentsjs/webcomponents-bundle.js.map +0 -1
  411. package/dist/webcomponentsjs/webcomponents-loader.js +0 -185
  412. package/src/Assets.js +0 -2
  413. package/src/CSS.js +0 -48
  414. package/src/FormatSettings.js +0 -31
  415. package/src/LocaleProvider.js +0 -34
  416. package/src/ResourceLoaderOverrides.js +0 -38
  417. package/src/SVGIconRegistry.js +0 -54
  418. package/src/boot.js +0 -32
  419. package/src/compatibility/DOMObserver.js +0 -62
  420. package/src/compatibility/patchNodeValue.js +0 -24
  421. package/src/compatibility/whenPolyfillLoaded.js +0 -26
  422. package/src/dates/CalendarDate.js +0 -203
  423. package/src/dates/CalendarUtils.js +0 -99
  424. package/src/delegate/CustomResize.js +0 -78
  425. package/src/delegate/NativeResize.js +0 -44
  426. package/src/events/PseudoEvents.js +0 -58
  427. package/src/features/browsersupport/Edge.js +0 -6
  428. package/src/features/browsersupport/IE11.js +0 -41
  429. package/src/features/calendar/Buddhist.js +0 -1
  430. package/src/features/calendar/Islamic.js +0 -1
  431. package/src/features/calendar/Japanese.js +0 -1
  432. package/src/features/calendar/Persian.js +0 -1
  433. package/src/json-imports/LocaleData.js +0 -171
  434. package/src/renderer/ifDefined.js +0 -21
  435. package/src/shims/Core-shim.js +0 -53
  436. package/src/theming/StyleInjection.js +0 -67
  437. package/src/thirdparty/Array.from.js +0 -16
  438. package/src/thirdparty/Array.prototype.fill.js +0 -44
  439. package/src/thirdparty/Array.prototype.find.js +0 -46
  440. package/src/thirdparty/Array.prototype.includes.js +0 -51
  441. package/src/thirdparty/Element.prototype.closest.js +0 -11
  442. package/src/thirdparty/Element.prototype.matches.js +0 -6
  443. package/src/thirdparty/Map.prototype.keys.js +0 -9
  444. package/src/thirdparty/Number.isInteger.js +0 -5
  445. package/src/thirdparty/Number.isNaN.js +0 -1
  446. package/src/thirdparty/Number.parseInt.js +0 -1
  447. package/src/thirdparty/Object.assign.js +0 -31
  448. package/src/thirdparty/Object.entries.js +0 -11
  449. package/src/thirdparty/Symbol.js +0 -2
  450. package/src/thirdparty/WeakSet.js +0 -27
  451. package/src/thirdparty/events-polyfills.js +0 -89
  452. package/src/thirdparty/fetch.js +0 -1
  453. package/src/thirdparty/template.js +0 -600
  454. 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
@@ -101,6 +188,14 @@ class UI5ElementMetadata {
101
188
  return !!this.metadata.managedSlots;
102
189
  }
103
190
 
191
+ /**
192
+ * Determines whether this control supports F6 fast navigation
193
+ * @public
194
+ */
195
+ supportsF6FastNavigation() {
196
+ return !!this.metadata.fastNavigation;
197
+ }
198
+
104
199
  /**
105
200
  * Returns an object with key-value pairs of properties and their metadata definitions
106
201
  * @public
@@ -116,6 +211,90 @@ class UI5ElementMetadata {
116
211
  getEvents() {
117
212
  return this.metadata.events || {};
118
213
  }
214
+
215
+ /**
216
+ * Determines whether this UI5 Element has any translatable texts (needs to be invalidated upon language change)
217
+ * @returns {boolean}
218
+ */
219
+ isLanguageAware() {
220
+ return !!this.metadata.languageAware;
221
+ }
222
+
223
+ /**
224
+ * Determines whether this UI5 Element has any theme dependant carachteristics.
225
+ * @returns {boolean}
226
+ */
227
+ isThemeAware() {
228
+ return !!this.metadata.themeAware;
229
+ }
230
+
231
+ /**
232
+ * Matches a changed entity (property/slot) with the given name against the "invalidateOnChildChange" configuration
233
+ * and determines whether this should cause and invalidation
234
+ *
235
+ * @param slotName the name of the slot in which a child was changed
236
+ * @param type the type of change in the child: "property" or "slot"
237
+ * @param name the name of the property/slot that changed
238
+ * @returns {boolean}
239
+ */
240
+ shouldInvalidateOnChildChange(slotName, type, name) {
241
+ const config = this.getSlots()[slotName].invalidateOnChildChange;
242
+
243
+ // invalidateOnChildChange was not set in the slot metadata - by default child changes do not affect the component
244
+ if (config === undefined) {
245
+ return false;
246
+ }
247
+
248
+ // The simple format was used: invalidateOnChildChange: true/false;
249
+ if (typeof config === "boolean") {
250
+ return config;
251
+ }
252
+
253
+ // The complex format was used: invalidateOnChildChange: { properties, slots }
254
+ if (typeof config === "object") {
255
+ // A property was changed
256
+ if (type === "property") {
257
+ // The config object does not have a properties field
258
+ if (config.properties === undefined) {
259
+ return false;
260
+ }
261
+
262
+ // The config object has the short format: properties: true/false
263
+ if (typeof config.properties === "boolean") {
264
+ return config.properties;
265
+ }
266
+
267
+ // The config object has the complex format: properties: [...]
268
+ if (Array.isArray(config.properties)) {
269
+ return config.properties.includes(name);
270
+ }
271
+
272
+ throw new Error("Wrong format for invalidateOnChildChange.properties: boolean or array is expected");
273
+ }
274
+
275
+ // A slot was changed
276
+ if (type === "slot") {
277
+ // The config object does not have a slots field
278
+ if (config.slots === undefined) {
279
+ return false;
280
+ }
281
+
282
+ // The config object has the short format: slots: true/false
283
+ if (typeof config.slots === "boolean") {
284
+ return config.slots;
285
+ }
286
+
287
+ // The config object has the complex format: slots: [...]
288
+ if (Array.isArray(config.slots)) {
289
+ return config.slots.includes(name);
290
+ }
291
+
292
+ throw new Error("Wrong format for invalidateOnChildChange.slots: boolean or array is expected");
293
+ }
294
+ }
295
+
296
+ throw new Error("Wrong format for invalidateOnChildChange: boolean or object is expected");
297
+ }
119
298
  }
120
299
 
121
300
  const validateSingleProperty = (value, propData) => {
@@ -136,23 +315,7 @@ const validateSingleProperty = (value, propData) => {
136
315
  };
137
316
 
138
317
  const validateSingleSlot = (value, slotData) => {
139
- if (value === null) {
140
- return value;
141
- }
142
-
143
- const getSlottedNodes = el => {
144
- const isTag = el instanceof HTMLElement;
145
- const isSlot = isTag && el.localName === "slot";
146
-
147
- if (isSlot) {
148
- return el.assignedNodes({ flatten: true }).filter(item => item instanceof HTMLElement);
149
- }
150
-
151
- return [el];
152
- };
153
-
154
- const slottedNodes = getSlottedNodes(value);
155
- slottedNodes.forEach(el => {
318
+ value && getSlottedElements(value).forEach(el => {
156
319
  if (!(el instanceof slotData.type)) {
157
320
  throw new Error(`${el} is not of type ${slotData.type}`);
158
321
  }
@@ -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 { isThemeFamily } 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 isThemeFamily("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,23 +1,34 @@
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",
18
14
  "ji": "yi",
19
15
  "in": "id",
20
- "sh": "sr",
16
+ };
17
+
18
+ const DEV_MODE = false;
19
+
20
+ const _showAssetsWarningOnce = localeId => {
21
+ if (warningShown) {
22
+ return;
23
+ }
24
+
25
+ if (!DEV_MODE) {
26
+ console.warn(`[LocaleData] Supported locale "${localeId}" not configured, import the "Assets.js" module from the webcomponents package you are using.`); /* eslint-disable-line */
27
+ } else {
28
+ 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 */
29
+ }
30
+
31
+ warningShown = true;
21
32
  };
22
33
 
23
34
  const calcLocale = (language, region, script) => {
@@ -36,73 +47,118 @@ const calcLocale = (language, region, script) => {
36
47
  }
37
48
  }
38
49
 
50
+ // Special case 3: for Serbian, there are cyrillic and latin scripts, "sh" and "sr-latn" map to "latin", "sr" maps to cyrillic.
51
+ if (language === "sh" || (language === "sr" && script === "Latn")) {
52
+ language = "sr";
53
+ region = "Latn";
54
+ }
55
+
39
56
  // try language + region
40
57
  let localeId = `${language}_${region}`;
41
- if (!supportedLocales.includes(localeId)) {
42
- // fallback to language only
43
- localeId = language;
58
+ if (SUPPORTED_LOCALES.includes(localeId)) {
59
+ if (loaders.has(localeId)) {
60
+ // supported and has loader
61
+ return localeId;
62
+ }
63
+
64
+ // supported, no loader - fallback to default and warn
65
+ _showAssetsWarningOnce(localeId);
66
+ return DEFAULT_LOCALE;
67
+ }
68
+
69
+ // not supported, try language only
70
+ localeId = language;
71
+ if (SUPPORTED_LOCALES.includes(localeId)) {
72
+ if (loaders.has(localeId)) {
73
+ // supported and has loader
74
+ return localeId;
75
+ }
76
+
77
+ // supported, no loader - fallback to default and warn
78
+ _showAssetsWarningOnce(localeId);
79
+ return DEFAULT_LOCALE;
44
80
  }
45
- if (!supportedLocales.includes(localeId)) {
46
- // fallback to english
47
- localeId = "en";
81
+
82
+ // not supported - fallback to default locale
83
+ return DEFAULT_LOCALE;
84
+ };
85
+
86
+ // internal set data
87
+ const setLocaleData = (localeId, content) => {
88
+ localeDataMap.set(localeId, content);
89
+ };
90
+
91
+ // external getSync
92
+ const getLocaleData = localeId => {
93
+ // if there is no loader, the default fallback was fetched and a warning was given - use default locale instead
94
+ if (!loaders.has(localeId)) {
95
+ localeId = DEFAULT_LOCALE;
96
+ }
97
+
98
+ const content = localeDataMap.get(localeId);
99
+ if (!content) {
100
+ throw new Error(`CLDR data for locale ${localeId} is not loaded!`);
48
101
  }
49
102
 
50
- return localeId;
103
+ return content;
51
104
  };
52
105
 
106
+ // load bundle over the network once
107
+ const _loadCldrOnce = localeId => {
108
+ const loadCldr = loaders.get(localeId);
53
109
 
54
- const resolveMissingMappings = () => {
55
- if (!cldrMappingFn) {
56
- return;
110
+ if (!cldrPromises.get(localeId)) {
111
+ cldrPromises.set(localeId, loadCldr(localeId));
57
112
  }
58
113
 
59
- const missingLocales = supportedLocales.filter(locale => !cldrData[locale] && !cldrUrls[locale]);
60
- missingLocales.forEach(locale => {
61
- cldrUrls[locale] = cldrMappingFn(locale);
62
- });
114
+ return cldrPromises.get(localeId);
63
115
  };
64
116
 
117
+ // external getAsync
65
118
  const fetchCldr = async (language, region, script) => {
66
- resolveMissingMappings();
67
119
  const localeId = calcLocale(language, region, script);
68
120
 
69
- let cldrObj = cldrData[localeId];
70
- const url = cldrUrls[localeId];
71
-
72
- if (!cldrObj && OpenUI5Support) {
73
- cldrObj = OpenUI5Support.getLocaleDataObject();
121
+ // reuse OpenUI5 CLDR if present
122
+ const OpenUI5Support = getFeature("OpenUI5Support");
123
+ if (OpenUI5Support) {
124
+ const cldrContent = OpenUI5Support.getLocaleDataObject();
125
+ if (cldrContent) {
126
+ // only if openui5 actually returned valid content
127
+ setLocaleData(localeId, cldrContent);
128
+ return;
129
+ }
74
130
  }
75
131
 
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);
132
+ // fetch it
133
+ try {
134
+ const cldrContent = await _loadCldrOnce(localeId);
135
+ setLocaleData(localeId, cldrContent);
136
+ } catch (e) {
137
+ if (!reportedErrors.has(e.message)) {
138
+ reportedErrors.add(e.message);
139
+ console.error(e.message); /* eslint-disable-line */
140
+ }
83
141
  }
84
142
  };
85
143
 
86
- const registerCldr = (locale, url) => {
87
- cldrUrls[locale] = url;
144
+ const registerLocaleDataLoader = (localeId, loader) => {
145
+ loaders.set(localeId, loader);
88
146
  };
89
147
 
90
- const setCldrData = (locale, data) => {
91
- cldrData[locale] = data;
92
- };
93
-
94
- const getCldrData = locale => {
95
- return cldrData[locale];
96
- };
148
+ // register default loader for "en" from ui5 CDN (dev workflow without assets)
149
+ registerLocaleDataLoader("en", async runtimeLocaleId => {
150
+ return (await fetch(`https://ui5.sap.com/1.60.2/resources/sap/ui/core/cldr/en.json`)).json();
151
+ });
97
152
 
98
- const _registerMappingFunction = mappingFn => {
99
- cldrMappingFn = mappingFn;
100
- };
153
+ // When the language changes dynamically (the user calls setLanguage),
154
+ // re-fetch the required CDRD data.
155
+ attachLanguageChange(() => {
156
+ const locale = getLocale();
157
+ return fetchCldr(locale.getLanguage(), locale.getRegion(), locale.getScript());
158
+ });
101
159
 
102
160
  export {
161
+ registerLocaleDataLoader,
103
162
  fetchCldr,
104
- registerCldr,
105
- setCldrData,
106
- getCldrData,
107
- _registerMappingFunction,
163
+ getLocaleData,
108
164
  };