@internetarchive/bookreader 5.0.0-10-alpha-1 → 5.0.0-100

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 (374) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +428 -1139
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.LICENSE.txt +20 -20
  6. package/BookReader/BookReader.js.map +1 -1
  7. package/BookReader/bergamot-translator-worker.js +2966 -0
  8. package/BookReader/bergamot-translator-worker.wasm +0 -0
  9. package/BookReader/hypothesis/LICENSE +50 -0
  10. package/BookReader/hypothesis/README.md +55 -0
  11. package/BookReader/hypothesis/build/boot.js +1 -0
  12. package/BookReader/hypothesis/build/manifest.json +20 -0
  13. package/BookReader/hypothesis/build/scripts/annotator.bundle.js +184 -0
  14. package/BookReader/hypothesis/build/scripts/annotator.bundle.js.map +1 -0
  15. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js +798 -0
  16. package/BookReader/hypothesis/build/scripts/sidebar.bundle.js.map +1 -0
  17. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js +711 -0
  18. package/BookReader/hypothesis/build/scripts/ui-playground.bundle.js.map +1 -0
  19. package/BookReader/hypothesis/build/styles/annotator.css +2235 -0
  20. package/BookReader/hypothesis/build/styles/annotator.css.map +1 -0
  21. package/BookReader/hypothesis/build/styles/fonts/KaTeX_AMS-Regular.woff2 +0 -0
  22. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Bold.woff2 +0 -0
  23. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Caligraphic-Regular.woff2 +0 -0
  24. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Bold.woff2 +0 -0
  25. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Fraktur-Regular.woff2 +0 -0
  26. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Bold.woff2 +0 -0
  27. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-BoldItalic.woff2 +0 -0
  28. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Italic.woff2 +0 -0
  29. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Main-Regular.woff2 +0 -0
  30. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-BoldItalic.woff2 +0 -0
  31. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Math-Italic.woff2 +0 -0
  32. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Bold.woff2 +0 -0
  33. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Italic.woff2 +0 -0
  34. package/BookReader/hypothesis/build/styles/fonts/KaTeX_SansSerif-Regular.woff2 +0 -0
  35. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Script-Regular.woff2 +0 -0
  36. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size1-Regular.woff2 +0 -0
  37. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size2-Regular.woff2 +0 -0
  38. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size3-Regular.woff2 +0 -0
  39. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Size4-Regular.woff2 +0 -0
  40. package/BookReader/hypothesis/build/styles/fonts/KaTeX_Typewriter-Regular.woff2 +0 -0
  41. package/BookReader/hypothesis/build/styles/highlights.css +2 -0
  42. package/BookReader/hypothesis/build/styles/highlights.css.map +1 -0
  43. package/BookReader/hypothesis/build/styles/katex.min.css +2 -0
  44. package/BookReader/hypothesis/build/styles/katex.min.css.map +1 -0
  45. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css +2 -0
  46. package/BookReader/hypothesis/build/styles/pdfjs-overrides.css.map +1 -0
  47. package/BookReader/hypothesis/build/styles/sidebar.css +2731 -0
  48. package/BookReader/hypothesis/build/styles/sidebar.css.map +1 -0
  49. package/BookReader/hypothesis/build/styles/ui-playground.css +2659 -0
  50. package/BookReader/hypothesis/build/styles/ui-playground.css.map +1 -0
  51. package/BookReader/hypothesis/package.json +126 -0
  52. package/BookReader/ia-bookreader-bundle.js +1782 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +7 -0
  54. package/BookReader/ia-bookreader-bundle.js.map +1 -0
  55. package/BookReader/icons/1up.svg +1 -1
  56. package/BookReader/icons/2up.svg +1 -1
  57. package/BookReader/icons/advance.svg +1 -1
  58. package/BookReader/icons/chevron-right.svg +1 -1
  59. package/BookReader/icons/close-circle-dark.svg +1 -1
  60. package/BookReader/icons/close-circle.svg +1 -1
  61. package/BookReader/icons/fullscreen.svg +1 -1
  62. package/BookReader/icons/fullscreen_exit.svg +1 -1
  63. package/BookReader/icons/hamburger.svg +1 -1
  64. package/BookReader/icons/left-arrow.svg +1 -1
  65. package/BookReader/icons/magnify-minus.svg +1 -1
  66. package/BookReader/icons/magnify-plus.svg +1 -1
  67. package/BookReader/icons/magnify.svg +1 -1
  68. package/BookReader/icons/pause.svg +1 -1
  69. package/BookReader/icons/play.svg +1 -1
  70. package/BookReader/icons/playback-speed.svg +1 -1
  71. package/BookReader/icons/read-aloud.svg +1 -1
  72. package/BookReader/icons/review.svg +1 -1
  73. package/BookReader/icons/thumbnails.svg +1 -1
  74. package/BookReader/icons/voice.svg +1 -0
  75. package/BookReader/icons/volume-full.svg +1 -1
  76. package/BookReader/images/BRicons.svg +3 -3
  77. package/BookReader/images/books_graphic.svg +1 -1
  78. package/BookReader/images/hypothesis.ico +0 -0
  79. package/BookReader/images/icon_book.svg +1 -1
  80. package/BookReader/images/icon_bookmark.svg +1 -1
  81. package/BookReader/images/icon_experiment.svg +1 -0
  82. package/BookReader/images/icon_gear.svg +1 -1
  83. package/BookReader/images/icon_hamburger.svg +1 -1
  84. package/BookReader/images/icon_home.svg +1 -1
  85. package/BookReader/images/icon_info.svg +1 -1
  86. package/BookReader/images/icon_one_page.svg +1 -1
  87. package/BookReader/images/icon_pause.svg +1 -1
  88. package/BookReader/images/icon_play.svg +1 -1
  89. package/BookReader/images/icon_playback-rate.svg +1 -1
  90. package/BookReader/images/icon_search_button.svg +1 -1
  91. package/BookReader/images/icon_share.svg +1 -1
  92. package/BookReader/images/icon_skip-ahead.svg +1 -1
  93. package/BookReader/images/icon_skip-back.svg +1 -1
  94. package/BookReader/images/icon_speaker.svg +1 -1
  95. package/BookReader/images/icon_speaker_open.svg +1 -1
  96. package/BookReader/images/icon_thumbnails.svg +1 -1
  97. package/BookReader/images/icon_toc.svg +1 -1
  98. package/BookReader/images/icon_two_pages.svg +1 -1
  99. package/BookReader/images/marker_chap-off.svg +1 -1
  100. package/BookReader/images/marker_chap-on.svg +1 -1
  101. package/BookReader/images/marker_srch-on.svg +1 -1
  102. package/BookReader/images/translate.svg +1 -0
  103. package/BookReader/images/unviewable_page.png +0 -0
  104. package/BookReader/jquery-3.js +2 -0
  105. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  106. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  107. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  108. package/BookReader/plugins/plugin.autoplay.js +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  110. package/BookReader/plugins/plugin.chapters.js +25 -1
  111. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  112. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  113. package/BookReader/plugins/plugin.experiments.js +3 -0
  114. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  115. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  116. package/BookReader/plugins/plugin.iframe.js +1 -1
  117. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  118. package/BookReader/plugins/plugin.iiif.js +2 -0
  119. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  120. package/BookReader/plugins/plugin.resume.js +1 -1
  121. package/BookReader/plugins/plugin.resume.js.map +1 -1
  122. package/BookReader/plugins/plugin.search.js +2 -1
  123. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  124. package/BookReader/plugins/plugin.search.js.map +1 -1
  125. package/BookReader/plugins/plugin.text_selection.js +2 -1
  126. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  127. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  128. package/BookReader/plugins/plugin.translate.js +137 -0
  129. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  130. package/BookReader/plugins/plugin.translate.js.map +1 -0
  131. package/BookReader/plugins/plugin.tts.js +1 -1
  132. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  133. package/BookReader/plugins/plugin.tts.js.map +1 -1
  134. package/BookReader/plugins/plugin.url.js +1 -1
  135. package/BookReader/plugins/plugin.url.js.map +1 -1
  136. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  137. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  138. package/BookReader/plugins/translator-worker.js +2 -0
  139. package/BookReader/plugins/translator-worker.js.map +1 -0
  140. package/BookReader/silence.mp3 +0 -0
  141. package/BookReader/translator-worker.js +475 -0
  142. package/BookReader/webcomponents-bundle.js +3 -0
  143. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  144. package/BookReader/webcomponents-bundle.js.map +1 -0
  145. package/README.md +14 -3
  146. package/jsconfig.json +19 -0
  147. package/package.json +84 -64
  148. package/src/BookNavigator/assets/bookmark-colors.js +1 -1
  149. package/src/BookNavigator/assets/button-base.js +2 -1
  150. package/src/BookNavigator/assets/ia-logo.js +17 -0
  151. package/src/BookNavigator/assets/icon_checkmark.js +1 -1
  152. package/src/BookNavigator/assets/icon_close.js +1 -1
  153. package/src/BookNavigator/book-navigator.js +620 -0
  154. package/src/BookNavigator/bookmarks/bookmark-button.js +3 -2
  155. package/src/BookNavigator/bookmarks/bookmark-edit.js +2 -3
  156. package/src/BookNavigator/bookmarks/bookmarks-list.js +2 -3
  157. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +2 -2
  158. package/src/BookNavigator/bookmarks/bookmarks-provider.js +27 -17
  159. package/src/BookNavigator/bookmarks/ia-bookmarks.js +116 -67
  160. package/src/BookNavigator/delete-modal-actions.js +1 -1
  161. package/src/BookNavigator/downloads/downloads-provider.js +36 -21
  162. package/src/BookNavigator/downloads/downloads.js +24 -4
  163. package/src/BookNavigator/search/search-provider.js +55 -27
  164. package/src/BookNavigator/search/search-results.js +25 -11
  165. package/src/BookNavigator/sharing.js +27 -0
  166. package/src/BookNavigator/viewable-files.js +95 -0
  167. package/src/BookNavigator/visual-adjustments/visual-adjustments-provider.js +13 -12
  168. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +9 -9
  169. package/src/BookReader/BookModel.js +92 -46
  170. package/src/BookReader/DragScrollable.js +233 -0
  171. package/src/BookReader/ImageCache.js +49 -16
  172. package/src/BookReader/Mode1Up.js +58 -360
  173. package/src/BookReader/Mode1UpLit.js +393 -0
  174. package/src/BookReader/Mode2Up.js +75 -1318
  175. package/src/BookReader/Mode2UpLit.js +787 -0
  176. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  177. package/src/BookReader/ModeSmoothZoom.js +312 -0
  178. package/src/BookReader/ModeThumb.js +20 -12
  179. package/src/BookReader/Navbar/Navbar.js +130 -53
  180. package/src/BookReader/PageContainer.js +120 -23
  181. package/src/BookReader/ReduceSet.js +2 -2
  182. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  183. package/src/BookReader/events.js +2 -3
  184. package/src/BookReader/options.js +87 -16
  185. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  186. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  187. package/src/BookReader/utils/SelectionObserver.js +45 -0
  188. package/src/BookReader/utils/classes.js +1 -1
  189. package/src/BookReader/utils.js +136 -12
  190. package/src/BookReader.js +641 -1192
  191. package/src/BookReaderPlugin.js +52 -0
  192. package/src/assets/icons/magnify-minus.svg +3 -7
  193. package/src/assets/icons/magnify-plus.svg +3 -7
  194. package/src/assets/icons/voice.svg +1 -0
  195. package/src/assets/images/hypothesis.ico +0 -0
  196. package/src/assets/images/icon_experiment.svg +1 -0
  197. package/src/assets/images/translate.svg +1 -0
  198. package/src/assets/images/unviewable_page.png +0 -0
  199. package/src/assets/silence.mp3 +0 -0
  200. package/src/css/BookReader.scss +1 -5
  201. package/src/css/_BRBookmarks.scss +1 -1
  202. package/src/css/_BRComponent.scss +1 -1
  203. package/src/css/_BRicon.scss +8 -2
  204. package/src/css/_BRmain.scss +16 -3
  205. package/src/css/_BRnav.scss +12 -66
  206. package/src/css/_BRpages.scss +163 -43
  207. package/src/css/_BRsearch.scss +69 -30
  208. package/src/css/_BRtoolbar.scss +5 -5
  209. package/src/css/_TextSelection.scss +129 -24
  210. package/src/css/_colorbox.scss +2 -2
  211. package/src/css/_controls.scss +24 -7
  212. package/src/css/_icons.scss +1 -1
  213. package/src/ia-bookreader/ia-bookreader.js +224 -0
  214. package/src/plugins/plugin.archive_analytics.js +84 -78
  215. package/src/plugins/plugin.autoplay.js +99 -104
  216. package/src/plugins/plugin.chapters.js +314 -205
  217. package/src/plugins/plugin.experiments.js +321 -0
  218. package/src/plugins/plugin.iframe.js +1 -1
  219. package/src/plugins/plugin.iiif.js +141 -0
  220. package/src/plugins/plugin.resume.js +54 -51
  221. package/src/plugins/plugin.text_selection.js +510 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +370 -392
  224. package/src/plugins/search/utils.js +43 -0
  225. package/src/plugins/search/view.js +49 -67
  226. package/src/plugins/translate/TranslationManager.js +162 -0
  227. package/src/plugins/translate/plugin.translate.js +523 -0
  228. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  229. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  230. package/src/plugins/tts/PageChunk.js +33 -21
  231. package/src/plugins/tts/PageChunkIterator.js +11 -17
  232. package/src/plugins/tts/WebTTSEngine.js +131 -91
  233. package/src/plugins/tts/plugin.tts.js +344 -350
  234. package/src/plugins/tts/utils.js +49 -47
  235. package/src/plugins/url/UrlPlugin.js +191 -0
  236. package/src/plugins/{plugin.url.js → url/plugin.url.js} +44 -15
  237. package/src/util/TextSelectionManager.js +282 -0
  238. package/src/util/browserSniffing.js +33 -1
  239. package/src/util/cache.js +20 -0
  240. package/src/util/docCookies.js +21 -2
  241. package/src/util/strings.js +1 -0
  242. package/.babelrc +0 -12
  243. package/.dependabot/config.yml +0 -6
  244. package/.eslintrc.js +0 -50
  245. package/.gitattributes +0 -2
  246. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  247. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  248. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  249. package/.github/workflows/node.js.yml +0 -37
  250. package/.github/workflows/npm-publish.yml +0 -47
  251. package/.testcaferc.json +0 -5
  252. package/BookReader/bookreader-component-bundle.js +0 -1450
  253. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  254. package/BookReader/bookreader-component-bundle.js.map +0 -1
  255. package/BookReader/jquery-1.10.1.js +0 -2
  256. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  257. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  258. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  259. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  260. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  261. package/BookReaderDemo/BookReaderDemo.css +0 -41
  262. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  263. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  264. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  265. package/BookReaderDemo/IIIFBookReader.js +0 -207
  266. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  267. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  268. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  273. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  274. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  275. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  276. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  277. package/BookReaderDemo/demo-advanced.html +0 -33
  278. package/BookReaderDemo/demo-autoplay.html +0 -38
  279. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  280. package/BookReaderDemo/demo-embed.html +0 -26
  281. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  282. package/BookReaderDemo/demo-fullscreen.html +0 -33
  283. package/BookReaderDemo/demo-iiif.html +0 -34
  284. package/BookReaderDemo/demo-iiif.js +0 -26
  285. package/BookReaderDemo/demo-internetarchive.html +0 -74
  286. package/BookReaderDemo/demo-multiple.html +0 -43
  287. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  288. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  289. package/BookReaderDemo/demo-simple.html +0 -34
  290. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  291. package/BookReaderDemo/immersion-1up.html +0 -64
  292. package/BookReaderDemo/immersion-mode.html +0 -35
  293. package/BookReaderDemo/toggle_controls.html +0 -53
  294. package/BookReaderDemo/view_mode.html +0 -39
  295. package/BookReaderDemo/viewmode-cycle.html +0 -41
  296. package/CHANGELOG.md +0 -493
  297. package/CONTRIBUTING.md +0 -7
  298. package/codecov.yml +0 -17
  299. package/index.html +0 -31
  300. package/karma.conf.js +0 -23
  301. package/screenshot.png +0 -0
  302. package/scripts/postversion.js +0 -10
  303. package/scripts/preversion.js +0 -14
  304. package/scripts/version.js +0 -26
  305. package/src/BookNavigator/BookModel.js +0 -14
  306. package/src/BookNavigator/BookNavigator.js +0 -446
  307. package/src/BookNavigator/assets/book-loader.js +0 -27
  308. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  309. package/src/BookNavigator/search/a-search-result.js +0 -55
  310. package/src/BookReader/DebugConsole.js +0 -54
  311. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  312. package/src/ItemNavigator/ItemNavigator.js +0 -376
  313. package/src/ItemNavigator/providers/sharing.js +0 -29
  314. package/src/css/_MobileNav.scss +0 -194
  315. package/src/dragscrollable-br.js +0 -261
  316. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  317. package/src/plugins/plugin.mobile_nav.js +0 -287
  318. package/tests/BookReader/BookModel.test.js +0 -312
  319. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  320. package/tests/BookReader/DebugConsole.test.js +0 -25
  321. package/tests/BookReader/ImageCache.test.js +0 -150
  322. package/tests/BookReader/Mode1Up.test.js +0 -164
  323. package/tests/BookReader/Mode2Up.test.js +0 -247
  324. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  325. package/tests/BookReader/PageContainer.test.js +0 -115
  326. package/tests/BookReader/ReduceSet.test.js +0 -38
  327. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  328. package/tests/BookReader/utils/classes.test.js +0 -88
  329. package/tests/BookReader/utils.test.js +0 -109
  330. package/tests/BookReader.options.test.js +0 -39
  331. package/tests/BookReader.test.js +0 -301
  332. package/tests/e2e/README.md +0 -75
  333. package/tests/e2e/autoplay.test.js +0 -13
  334. package/tests/e2e/base.test.js +0 -35
  335. package/tests/e2e/helpers/base.js +0 -263
  336. package/tests/e2e/helpers/debug.js +0 -13
  337. package/tests/e2e/helpers/desktopSearch.js +0 -72
  338. package/tests/e2e/helpers/mobileSearch.js +0 -85
  339. package/tests/e2e/helpers/mockSearch.js +0 -93
  340. package/tests/e2e/helpers/rightToLeft.js +0 -29
  341. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  342. package/tests/e2e/models/BookReader.js +0 -11
  343. package/tests/e2e/models/Navigation.js +0 -56
  344. package/tests/e2e/rightToLeft.test.js +0 -20
  345. package/tests/e2e/viewmode.test.js +0 -37
  346. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  347. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  348. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  349. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  350. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  351. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  352. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  353. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  354. package/tests/plugins/plugin.autoplay.test.js +0 -52
  355. package/tests/plugins/plugin.chapters.test.js +0 -130
  356. package/tests/plugins/plugin.iframe.test.js +0 -42
  357. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  358. package/tests/plugins/plugin.resume.test.js +0 -98
  359. package/tests/plugins/plugin.text_selection.test.js +0 -203
  360. package/tests/plugins/plugin.url.test.js +0 -129
  361. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  362. package/tests/plugins/search/plugin.search.test.js +0 -173
  363. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  364. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  365. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  366. package/tests/plugins/tts/PageChunk.test.js +0 -57
  367. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  368. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  369. package/tests/plugins/tts/utils.test.js +0 -133
  370. package/tests/util/browserSniffing.test.js +0 -56
  371. package/tests/util/docCookies.test.js +0 -15
  372. package/tests/util/strings.test.js +0 -63
  373. package/tests/utils.js +0 -42
  374. package/webpack.config.js +0 -86
@@ -1,179 +0,0 @@
1
- import sinon from 'sinon';
2
- import PageChunkIterator from "../../../src/plugins/tts/PageChunkIterator";
3
- import PageChunk from '../../../src/plugins/tts/PageChunk';
4
-
5
- describe('Buffers pages', () => {
6
- test('Does not error if no room for reverse buffer', async () => {
7
- const iterator = new PageChunkIterator(100, 0, {pageBufferSize: 5});
8
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
9
- await iterator.next();
10
- expect(iterator._fetchPageChunksDirect.callCount).toBe(6);
11
- expect(Object.keys(iterator._bufferedPages).length).toBe(6);
12
- });
13
-
14
- test('Does not error if no room for forward buffer', async () => {
15
- const iterator = new PageChunkIterator(100, 99, {pageBufferSize: 5});
16
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
17
- await iterator.next();
18
- expect(iterator._fetchPageChunksDirect.callCount).toBe(6);
19
- expect(Object.keys(iterator._bufferedPages).length).toBe(6);
20
- });
21
-
22
- test('Fewer pages than buffer size', async () => {
23
- const iterator = new PageChunkIterator(1, 0, {pageBufferSize: 5});
24
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
25
- await iterator.next();
26
- expect(iterator._fetchPageChunksDirect.callCount).toBe(1);
27
- expect(Object.keys(iterator._bufferedPages).length).toBe(1);
28
- });
29
-
30
- test('Buffers data before/after', async () => {
31
- const iterator = new PageChunkIterator(100, 50, {pageBufferSize: 5});
32
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
33
- await iterator.next();
34
- expect(iterator._fetchPageChunksDirect.callCount).toBe(11);
35
- expect(Object.keys(iterator._bufferedPages).length).toBe(11);
36
- });
37
-
38
- test('Buffer size does not grow indefinitely', async () => {
39
- const iterator = new PageChunkIterator(100, 50, {pageBufferSize: 5});
40
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
41
- for (let i = 0; i < 5; i++) await iterator.next();
42
- expect(Object.keys(iterator._bufferedPages).length).toBe(11);
43
- });
44
-
45
- test('Does not make a new request if buffered', async () => {
46
- const iterator = new PageChunkIterator(10, 7, {pageBufferSize: 5});
47
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
48
-
49
- await iterator.next();
50
- expect(iterator._fetchPageChunksDirect.callCount).toBe(8);
51
-
52
- await iterator.next();
53
- expect(iterator._fetchPageChunksDirect.callCount).toBe(8);
54
- });
55
- });
56
-
57
- describe('Iterates pages', () => {
58
- test('Moves between chunks before moving between pages', async () => {
59
- const iterator = new PageChunkIterator(100, 50, {pageBufferSize: 5});
60
- const chunks = [
61
- dummyPageChunk(),
62
- dummyPageChunk(),
63
- dummyPageChunk(),
64
- ];
65
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves(chunks);
66
-
67
- for (let i = 0; i < 4; i++) {
68
- expect(iterator._cursor.page).toBe(50);
69
- expect(iterator._cursor.chunk).toBe(i);
70
- await iterator.next();
71
- }
72
-
73
- expect(iterator._cursor.page).toBe(51);
74
- expect(iterator._cursor.chunk).toBe(1);
75
- });
76
-
77
- test('Fires AT_END when done', async () => {
78
- const iterator = new PageChunkIterator(1, 0, {pageBufferSize: 5});
79
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
80
-
81
- expect((await iterator.next()) instanceof PageChunk).toBe(true);
82
- expect(await iterator.next()).toBe(PageChunkIterator.AT_END);
83
- });
84
-
85
- test('Fires AT_END reaching past end', async () => {
86
- const iterator = new PageChunkIterator(1, 0, {pageBufferSize: 5});
87
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([dummyPageChunk()]);
88
-
89
- expect((await iterator.next()) instanceof PageChunk).toBe(true);
90
- expect(iterator._cursor.page).toBe(0);
91
- expect(iterator._cursor.chunk).toBe(1);
92
-
93
- for (let i = 0; i < 4; i++) {
94
- expect(await iterator.next()).toBe(PageChunkIterator.AT_END);
95
- expect(iterator._cursor.page).toBe(1);
96
- expect(iterator._cursor.chunk).toBe(0);
97
- }
98
- });
99
-
100
- test('Moves backwards between chunks/pages', async () => {
101
- const iterator = new PageChunkIterator(100, 50, {pageBufferSize: 5});
102
- const chunks = [
103
- dummyPageChunk(),
104
- dummyPageChunk(),
105
- dummyPageChunk(),
106
- ];
107
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves(chunks);
108
- expect(iterator._cursor.page).toBe(50);
109
- expect(iterator._cursor.chunk).toBe(0);
110
-
111
- for (let i = 2; i >= 0; i--) {
112
- await iterator.decrement();
113
- expect(iterator._cursor.page).toBe(49);
114
- expect(iterator._cursor.chunk).toBe(i);
115
- }
116
-
117
- await iterator.decrement();
118
- expect(iterator._cursor.page).toBe(48);
119
- expect(iterator._cursor.chunk).toBe(2);
120
- });
121
-
122
- test('Moving backwards at start refires start chunk', async () => {
123
- const iterator = new PageChunkIterator(100, 0, {pageBufferSize: 5});
124
- const chunks = [
125
- dummyPageChunk(),
126
- dummyPageChunk(),
127
- dummyPageChunk(),
128
- ];
129
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves(chunks);
130
-
131
- for (let i = 0; i < 4; i++) {
132
- expect(iterator._cursor.page).toBe(0);
133
- expect(iterator._cursor.chunk).toBe(0);
134
- await iterator.decrement();
135
- }
136
- });
137
-
138
- test('Empty book', async () => {
139
- const iterator = new PageChunkIterator(100, 0, {pageBufferSize: 5});
140
- sinon.stub(iterator, '_fetchPageChunksDirect').resolves([]);
141
- const result = await iterator.next();
142
- expect(iterator._fetchPageChunksDirect.callCount).toBe(100);
143
- expect(result).toBe(PageChunkIterator.AT_END);
144
- });
145
-
146
- test('Moving forward through empty pages', async () => {
147
- const iterator = new PageChunkIterator(10, 0, {pageBufferSize: 5});
148
- const nonEmptyPages = {
149
- 0: [dummyPageChunk()],
150
- 5: [dummyPageChunk()],
151
- };
152
- sinon.stub(iterator, '_fetchPageChunksDirect')
153
- .callsFake(async i => nonEmptyPages[i] || []);
154
-
155
- const result0 = await iterator.next();
156
- expect(result0).toBe(nonEmptyPages[0][0]);
157
-
158
- const result1 = await iterator.next();
159
- expect(result1).toBe(nonEmptyPages[5][0]);
160
- });
161
-
162
- test('Moving backward through empty pages', async () => {
163
- const iterator = new PageChunkIterator(10, 5, {pageBufferSize: 5});
164
- const nonEmptyPages = {
165
- 0: [dummyPageChunk()],
166
- 5: [dummyPageChunk()],
167
- };
168
- sinon.stub(iterator, '_fetchPageChunksDirect')
169
- .callsFake(async i => nonEmptyPages[i] || []);
170
-
171
- await iterator.decrement();
172
- const result0 = await iterator.next();
173
- expect(result0).toBe(nonEmptyPages[0][0]);
174
- });
175
- });
176
-
177
- function dummyPageChunk() {
178
- return new PageChunk(0, 0, "Line", []);
179
- }
@@ -1,126 +0,0 @@
1
- import sinon from 'sinon';
2
- import { WebTTSSound } from '../../../src/plugins/tts/WebTTSEngine.js';
3
- import { afterEventLoop, eventTargetMixin } from '../../utils.js';
4
-
5
- beforeEach(() => {
6
- window.speechSynthesis = {
7
- cancel: sinon.stub(),
8
- speak: sinon.stub(),
9
- pause: sinon.stub(),
10
- resume: sinon.stub(),
11
- ...eventTargetMixin(),
12
- };
13
- window.SpeechSynthesisUtterance = function (text) {
14
- this.text = text;
15
- Object.assign(this, eventTargetMixin());
16
- };
17
- });
18
-
19
- afterEach(() => {
20
- delete window.speechSynthesis;
21
- delete window.SpeechSynthesisUtterance;
22
- });
23
-
24
-
25
- describe('WebTTSSound', () => {
26
- describe('setPlaybackRate', () => {
27
- test('works if not playing', () => {
28
- const sound = new WebTTSSound('hello world');
29
- sound.load();
30
- expect(sound.rate).toBe(1);
31
- sound.setPlaybackRate(2);
32
- expect(sound.rate).toBe(2);
33
- });
34
-
35
- test('reloading does not resolve the original promise', async () => {
36
- const sound = new WebTTSSound('hello world');
37
- sound.load();
38
- const finishSpy = sinon.spy();
39
- sound.play().then(finishSpy);
40
- sound.reload();
41
- sound.utterance.dispatchEvent('pause', {});
42
- await afterEventLoop();
43
- sound.utterance.dispatchEvent('end', {});
44
- await afterEventLoop();
45
- expect(finishSpy.callCount).toBe(0);
46
- });
47
- });
48
-
49
- describe('_chromePausingBugFix', () => {
50
- test('if speech less than 15s, nothing special', async () => {
51
- const clock = sinon.useFakeTimers();
52
- const sound = new WebTTSSound('hello world foo bar');
53
- sound.load();
54
- sound.play();
55
- sound._chromePausingBugFix();
56
- clock.tick(10000);
57
- sound.utterance.dispatchEvent('end', {});
58
- clock.restore();
59
- await afterEventLoop();
60
- expect(speechSynthesis.pause.callCount).toBe(0);
61
- });
62
-
63
- test('if speech greater than 15s, pause called', async () => {
64
- const clock = sinon.useFakeTimers();
65
- const sound = new WebTTSSound('foo bah');
66
- sound.load();
67
- sound.play();
68
- sound._chromePausingBugFix();
69
- clock.tick(20000);
70
- clock.restore();
71
-
72
- await afterEventLoop();
73
- expect(speechSynthesis.pause.callCount).toBe(1);
74
- });
75
-
76
- test('on pause reloads if timed out', async () => {
77
- const clock = sinon.useFakeTimers();
78
- const sound = new WebTTSSound('foo bah');
79
- sound.load();
80
- sound.play();
81
- sound._chromePausingBugFix();
82
- sound.pause();
83
- clock.tick(2000);
84
- clock.restore();
85
-
86
- await afterEventLoop();
87
- expect(speechSynthesis.cancel.callCount).toBe(1);
88
- });
89
- });
90
-
91
- test('fire pause if browser does not do it', async () => {
92
- const clock = sinon.useFakeTimers();
93
- const languageGetter = jest.spyOn(window.navigator, 'userAgent', 'get');
94
- languageGetter.mockReturnValue('firefox android');
95
- const sound = new WebTTSSound('foo bah');
96
- sound.load();
97
- sound.play();
98
- const dispatchSpy = sinon.spy(sound.utterance, 'dispatchEvent');
99
- sound.pause();
100
- clock.tick(1000);
101
- clock.restore();
102
-
103
- await afterEventLoop();
104
- expect(dispatchSpy.callCount).toBe(1);
105
- expect(dispatchSpy.args[0][0].type).toBe('pause');
106
- });
107
-
108
- test('fire resume if browser does not do it', async () => {
109
- const clock = sinon.useFakeTimers();
110
- const languageGetter = jest.spyOn(window.navigator, 'userAgent', 'get');
111
- languageGetter.mockReturnValue('firefox android');
112
- const sound = new WebTTSSound('foo bah');
113
- sound.load();
114
- sound.play();
115
- sound.started = true;
116
- sound.paused = true;
117
- const dispatchSpy = sinon.spy(sound.utterance, 'dispatchEvent');
118
- sound.resume();
119
- clock.tick(1000);
120
- clock.restore();
121
-
122
- await afterEventLoop();
123
- expect(dispatchSpy.callCount).toBe(1);
124
- expect(dispatchSpy.args[0][0].type).toBe('resume');
125
- });
126
- });
@@ -1,133 +0,0 @@
1
- import sinon from 'sinon';
2
- import { afterEventLoop, eventTargetMixin } from '../../utils.js';
3
- import * as utils from '../../../src/plugins/tts/utils.js';
4
-
5
- describe('promisifyEvent', () => {
6
- const { promisifyEvent } = utils;
7
-
8
- test('Resolves once event fires', async () => {
9
- const fakeTarget = eventTargetMixin();
10
- const resolveSpy = sinon.spy();
11
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
12
-
13
- await afterEventLoop();
14
- expect(resolveSpy.callCount).toBe(0);
15
- fakeTarget.dispatchEvent('pause', {});
16
- await afterEventLoop();
17
- expect(resolveSpy.callCount).toBe(1);
18
- });
19
-
20
- test('Only resolves once', async () => {
21
- const fakeTarget = eventTargetMixin();
22
- const resolveSpy = sinon.spy();
23
- promisifyEvent(fakeTarget, 'pause').then(resolveSpy);
24
-
25
- await afterEventLoop();
26
- expect(resolveSpy.callCount).toBe(0);
27
- fakeTarget.dispatchEvent('pause', {});
28
- fakeTarget.dispatchEvent('pause', {});
29
- fakeTarget.dispatchEvent('pause', {});
30
- fakeTarget.dispatchEvent('pause', {});
31
-
32
- await afterEventLoop();
33
- expect(resolveSpy.callCount).toBe(1);
34
- });
35
- });
36
-
37
- describe('approximateWordCount', () => {
38
- const { approximateWordCount } = utils;
39
-
40
- test('Empties', () => {
41
- expect(approximateWordCount('')).toBe(0);
42
- expect(approximateWordCount(' ')).toBe(0);
43
- });
44
-
45
- test('Spaceless', () => {
46
- expect(approximateWordCount('supercalifragilisticexpialidocious')).toBe(1);
47
- });
48
-
49
- test('Basic', () => {
50
- expect(approximateWordCount('the quick brown fox jumped over the lazy dog')).toBe(9);
51
- expect(approximateWordCount('to be or not to be that is the question')).toBe(10);
52
- });
53
-
54
- test('Spacing', () => {
55
- expect(approximateWordCount(' the quick brown fox jumped over the lazy dog ')).toBe(9);
56
- });
57
-
58
- test('Punctuation not separate word (unless separate)', () => {
59
- expect(approximateWordCount('the. quick brown. fox. jumped. over the. lazy dog.')).toBe(9);
60
- expect(approximateWordCount(' . . . . . ')).toBe(5);
61
- });
62
-
63
- test('Realword examples', () => {
64
- expect(approximateWordCount("Albert\u2019s cats had a .large blue dish of milk for breakfast.")).toBe(11);
65
- expect(approximateWordCount("FARM FOLK O nce upon a time there was a sturdy little boy who lived in Belgium. Every morning after he milked the cows, he gave his cats a large blue dish of milk for breakfast.")).toBe(36);
66
- });
67
- });
68
-
69
- describe('sleep', () => {
70
- const { sleep } = utils;
71
-
72
- test('Sleep 0 doest not called immediately', async () => {
73
- const spy = sinon.spy();
74
- sleep(0).then(spy);
75
- expect(spy.callCount).toBe(0);
76
- await afterEventLoop();
77
- expect(spy.callCount).toBe(1);
78
- });
79
-
80
- test('Waits the appropriate ms', async () => {
81
- const clock = sinon.useFakeTimers();
82
- const spy = sinon.spy();
83
- sleep(10).then(spy);
84
- expect(spy.callCount).toBe(0);
85
- clock.tick(10);
86
- expect(spy.callCount).toBe(0);
87
- clock.restore();
88
-
89
- await afterEventLoop();
90
- expect(spy.callCount).toBe(1);
91
- });
92
- });
93
-
94
- describe('toISO6391', () => {
95
- const { toISO6391 } = utils;
96
-
97
- test('ISO 639-1', () => {
98
- expect(toISO6391('en')).toBe('en');
99
- expect(toISO6391('fr')).toBe('fr');
100
- expect(toISO6391('SQ')).toBe('sq');
101
- expect(toISO6391('aa')).toBe('aa');
102
- });
103
-
104
- test('ISO 639-2/T', () => {
105
- expect(toISO6391('amh')).toBe('am');
106
- expect(toISO6391('BIH')).toBe('bh');
107
- });
108
-
109
- test('ISO 639-2/B', () => {
110
- expect(toISO6391('BAQ')).toBe('eu');
111
- expect(toISO6391('chi')).toBe('zh');
112
- });
113
-
114
- test('Name', () => {
115
- expect(toISO6391('english')).toBe('en');
116
- expect(toISO6391('German')).toBe('de');
117
- });
118
-
119
- test('Endonym', () => {
120
- expect(toISO6391('français')).toBe('fr');
121
- expect(toISO6391('汉语')).toBe('zh');
122
- });
123
-
124
- test('Mismatch', () => {
125
- expect(toISO6391('Parseltongue')).toBe(null);
126
- expect(toISO6391('Pig Latin')).toBe(null);
127
- });
128
-
129
- test('Falsey inputs', () => {
130
- expect(toISO6391(null)).toBe(null);
131
- expect(toISO6391('')).toBe(null);
132
- });
133
- });
@@ -1,56 +0,0 @@
1
- import {
2
- isChrome, isFirefox, isSafari,
3
- } from '../../src/util/browserSniffing.js';
4
-
5
- const TESTS = [
6
- {
7
- name: 'Firefox on Windows 10',
8
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0',
9
- vendor: '',
10
- machingFn: isFirefox,
11
- },
12
- {
13
- name: 'Chrome on Windows 10',
14
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.90 Safari/537.36',
15
- vendor: 'Google Inc.',
16
- machingFn: isChrome,
17
- },
18
- {
19
- name: 'Edge on Windows 10',
20
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; ServiceUI 14) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.18362',
21
- vendor: '',
22
- machingFn: null,
23
- },
24
- {
25
- name: 'IE11 on Windows 10',
26
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; Touch; .NET4.0C; .NET4.0E; Tablet PC 2.0; Zoom 3.6.0; rv:11.0) like Gecko',
27
- vendor: '',
28
- machingFn: null,
29
- },
30
- {
31
- name: 'Chromium on Windows 10',
32
- userAgent: 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3923.0 Safari/537.36',
33
- vendor: 'Google Inc.',
34
- machingFn: isChrome,
35
- },
36
- {
37
- name: 'Safari 12 on Mojave',
38
- userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.1.2 Safari/605.1.15',
39
- vendor: 'Apple Computer, Inc.',
40
- machingFn: isSafari,
41
- },
42
- {
43
- name: 'Safari 10 on iPhone 7',
44
- userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Version/10.0 Mobile/14E304 Safari/602.1',
45
- vendor: 'Apple Computer, Inc.',
46
- machingFn: isSafari,
47
- },
48
- ];
49
-
50
- for (const fn of [isChrome, isFirefox, isSafari]) {
51
- describe(fn.name, () => {
52
- for (const { name, userAgent, vendor, machingFn } of TESTS) {
53
- test(name, () => expect(fn(userAgent, vendor)).toBe(machingFn == fn));
54
- }
55
- });
56
- }
@@ -1,15 +0,0 @@
1
- import * as docCookies from '../../src/util/docCookies.js';
2
-
3
- afterEach(() => {
4
- jest.clearAllMocks();
5
- });
6
-
7
- describe('Helper function: set and get cookie item', () => {
8
- test('set cookie item value', () => {
9
- expect(docCookies.setItem('test-cookie', 'jack-sparow')).toBeTruthy();
10
- });
11
-
12
- test('get cookie item value', () => {
13
- expect(docCookies.getItem('test-cookie')).toEqual('jack-sparow');
14
- });
15
- });
@@ -1,63 +0,0 @@
1
- import { APPLY_FILTERS, applyVariables } from '../../src/util/strings.js';
2
-
3
- describe('applyVariables', () => {
4
- test('null cases', () => {
5
- expect(applyVariables(null, {})).toBeUndefined();
6
- expect(applyVariables('', {})).toEqual('');
7
- expect(applyVariables('', {x: 3})).toEqual('');
8
- });
9
-
10
- test('Ignores undefined variables', () => {
11
- expect(applyVariables('Hello {{name}}!', {})).toEqual('Hello {{name}}!');
12
- });
13
-
14
- test('Replaces multiple instances', () => {
15
- expect(applyVariables('Hello {{name}}! How are you doing, {{name}}?', {name: 'Bill'})).toEqual('Hello Bill! How are you doing, Bill?');
16
- expect(applyVariables('Hello {{name}}! You are {{age}}, {{name}}', {name: 'Bill', age: 54})).toEqual('Hello Bill! You are 54, Bill');
17
- });
18
-
19
- test('Is case sensitive', () => {
20
- expect(applyVariables('Hello {{name}}', {NAME: 'Bill'})).toEqual('Hello {{name}}');
21
- });
22
-
23
- test('Supports variable names with funny chars', () => {
24
- expect(applyVariables('Hello {{first name}}', {'first name': 'Bill'})).toEqual('Hello Bill');
25
- });
26
-
27
- test('Overrides do override', () => {
28
- expect(applyVariables('Hello {{name}}', {name: 'Bill'}, {name: 'Bobby'})).toEqual('Hello Bobby');
29
- });
30
-
31
- test('Nullish values', () => {
32
- expect(applyVariables('Hello {{name}}', {name: undefined})).toEqual('Hello undefined');
33
- expect(applyVariables('Hello {{name}}', {name: null})).toEqual('Hello null');
34
- expect(applyVariables('Hello {{name}}', {name: ''})).toEqual('Hello ');
35
- });
36
-
37
- test('Non-string values', () => {
38
- expect(applyVariables('Hello {{name}}', {name: 10})).toEqual('Hello 10');
39
- expect(applyVariables('Hello {{name}}', {name: 0})).toEqual('Hello 0');
40
- });
41
-
42
- test('Filters', () => {
43
- expect(applyVariables('Hello {{name|urlencode}}', {name: 'Jim bob'})).toEqual('Hello Jim%20bob');
44
- expect(applyVariables('Hello {{name|urlencode}}', {name: 0})).toEqual('Hello 0');
45
- expect(applyVariables('Hello {{name|urlencode}}', {})).toEqual('Hello {{name|urlencode}}');
46
- });
47
-
48
- test('Custom filters', () => {
49
- expect(applyVariables('Hello {{name|upper}}', {name: 'Jim bob'}, {}, {upper: s => s.toUpperCase()})).toEqual('Hello JIM BOB');
50
- });
51
-
52
- test('Multiple filters', () => {
53
- const filters = Object.assign({}, APPLY_FILTERS, {
54
- upper: s => s.toUpperCase(),
55
- lower: s => s.toLowerCase(),
56
- double: s => s + s,
57
- });
58
- expect(applyVariables('Hello {{name|upper|urlencode}}', {name: 'Jim bob'}, {}, filters)).toEqual('Hello JIM%20BOB');
59
- expect(applyVariables('Hello {{name|upper|lower}}', {name: 'Jim bob'}, {}, filters)).toEqual('Hello jim bob');
60
- expect(applyVariables('Hello {{name|lower|upper}}', {name: 'Jim bob'}, {}, filters)).toEqual('Hello JIM BOB');
61
- expect(applyVariables('Hello {{name|lower|double}}', {name: 'Jim bob'}, {}, filters)).toEqual('Hello jim bobjim bob');
62
- });
63
- });
package/tests/utils.js DELETED
@@ -1,42 +0,0 @@
1
- /**
2
- * Resolves after all enqueued callbacks in the event loop have resolved.
3
- * @return {Promise}
4
- */
5
- export function afterEventLoop() {
6
- // Waiting 0 seconds essentially lets us run at the end of the event
7
- // loop (i.e. after any promises which aren't _actually_ async have finished)
8
- return new Promise(res => setTimeout(res, 0));
9
- }
10
-
11
- /**
12
- * Event target mixin
13
- * @return {EventTarget}
14
- */
15
- export function eventTargetMixin() {
16
- return {
17
- addEventListener(evName, listener) {
18
- const listeners = this._listeners[evName] || [];
19
- listeners.push(listener);
20
- this._listeners[evName] = listeners;
21
- },
22
- dispatchEvent(evName, ev) {
23
- const listeners = this._listeners[evName] || [];
24
- listeners.forEach(fn => fn(ev));
25
- },
26
- removeEventListener(evName, listener) {
27
- const listeners = this._listeners[evName] || [];
28
- this._listeners[evName] = listeners.filter(fn => fn != listener);
29
- },
30
- _listeners: {},
31
- };
32
- }
33
-
34
- /**
35
- * Lazy deep copy function; only supports objects (no classes)
36
- * @template T
37
- * @param {T} obj
38
- * @return {T}
39
- */
40
- export function deepCopy(obj) {
41
- return JSON.parse(JSON.stringify(obj));
42
- }