@internetarchive/bookreader 5.0.0-11 → 5.0.0-111

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 (381) hide show
  1. package/BookReader/474.js +2 -0
  2. package/BookReader/474.js.map +1 -0
  3. package/BookReader/BookReader.css +649 -1225
  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 +1904 -0
  53. package/BookReader/ia-bookreader-bundle.js.LICENSE.txt +19 -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/slider-toggle.svg +1 -0
  74. package/BookReader/icons/thumbnails.svg +1 -1
  75. package/BookReader/icons/voice.svg +1 -0
  76. package/BookReader/icons/volume-full.svg +1 -1
  77. package/BookReader/images/BRicons.svg +3 -3
  78. package/BookReader/images/books_graphic.svg +1 -1
  79. package/BookReader/images/hypothesis.ico +0 -0
  80. package/BookReader/images/icon_book.svg +1 -1
  81. package/BookReader/images/icon_bookmark.svg +1 -1
  82. package/BookReader/images/icon_experiment.svg +1 -0
  83. package/BookReader/images/icon_gear.svg +1 -1
  84. package/BookReader/images/icon_hamburger.svg +1 -1
  85. package/BookReader/images/icon_home.svg +1 -1
  86. package/BookReader/images/icon_info.svg +1 -1
  87. package/BookReader/images/icon_one_page.svg +1 -1
  88. package/BookReader/images/icon_pause.svg +1 -1
  89. package/BookReader/images/icon_play.svg +1 -1
  90. package/BookReader/images/icon_playback-rate.svg +1 -1
  91. package/BookReader/images/icon_search_button.svg +1 -1
  92. package/BookReader/images/icon_share.svg +1 -1
  93. package/BookReader/images/icon_skip-ahead.svg +1 -1
  94. package/BookReader/images/icon_skip-back.svg +1 -1
  95. package/BookReader/images/icon_speaker.svg +1 -1
  96. package/BookReader/images/icon_speaker_open.svg +1 -1
  97. package/BookReader/images/icon_thumbnails.svg +1 -1
  98. package/BookReader/images/icon_toc.svg +1 -1
  99. package/BookReader/images/icon_two_pages.svg +1 -1
  100. package/BookReader/images/marker_chap-off.svg +1 -1
  101. package/BookReader/images/marker_chap-on.svg +1 -1
  102. package/BookReader/images/marker_srch-on.svg +1 -1
  103. package/BookReader/images/translate.svg +1 -0
  104. package/BookReader/images/unviewable_page.png +0 -0
  105. package/BookReader/jquery-3.js +2 -0
  106. package/BookReader/jquery-3.js.LICENSE.txt +24 -0
  107. package/BookReader/plugins/plugin.archive_analytics.js +1 -1
  108. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  109. package/BookReader/plugins/plugin.autoplay.js +1 -1
  110. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  111. package/BookReader/plugins/plugin.chapters.js +22 -1
  112. package/BookReader/plugins/plugin.chapters.js.LICENSE.txt +1 -0
  113. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  114. package/BookReader/plugins/plugin.experiments.js +3 -0
  115. package/BookReader/plugins/plugin.experiments.js.LICENSE.txt +1 -0
  116. package/BookReader/plugins/plugin.experiments.js.map +1 -0
  117. package/BookReader/plugins/plugin.iframe.js +1 -1
  118. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  119. package/BookReader/plugins/plugin.iiif.js +2 -0
  120. package/BookReader/plugins/plugin.iiif.js.map +1 -0
  121. package/BookReader/plugins/plugin.resume.js +1 -1
  122. package/BookReader/plugins/plugin.resume.js.map +1 -1
  123. package/BookReader/plugins/plugin.search.js +2 -1
  124. package/BookReader/plugins/plugin.search.js.LICENSE.txt +1 -0
  125. package/BookReader/plugins/plugin.search.js.map +1 -1
  126. package/BookReader/plugins/plugin.text_selection.js +24 -1
  127. package/BookReader/plugins/plugin.text_selection.js.LICENSE.txt +1 -0
  128. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  129. package/BookReader/plugins/plugin.translate.js +159 -0
  130. package/BookReader/plugins/plugin.translate.js.LICENSE.txt +1 -0
  131. package/BookReader/plugins/plugin.translate.js.map +1 -0
  132. package/BookReader/plugins/plugin.tts.js +1 -1
  133. package/BookReader/plugins/plugin.tts.js.LICENSE.txt +2 -0
  134. package/BookReader/plugins/plugin.tts.js.map +1 -1
  135. package/BookReader/plugins/plugin.url.js +2 -1
  136. package/BookReader/plugins/plugin.url.js.LICENSE.txt +1 -0
  137. package/BookReader/plugins/plugin.url.js.map +1 -1
  138. package/BookReader/plugins/plugin.vendor-fullscreen.js +1 -1
  139. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  140. package/BookReader/plugins/translator-worker.js +2 -0
  141. package/BookReader/plugins/translator-worker.js.map +1 -0
  142. package/BookReader/silence.mp3 +0 -0
  143. package/BookReader/translator-worker.js +475 -0
  144. package/BookReader/webcomponents-bundle.js +3 -0
  145. package/BookReader/webcomponents-bundle.js.LICENSE.txt +9 -0
  146. package/BookReader/webcomponents-bundle.js.map +1 -0
  147. package/README.md +14 -3
  148. package/jsconfig.json +19 -0
  149. package/package.json +93 -70
  150. package/src/BookReader/BookModel.js +92 -46
  151. package/src/BookReader/DragScrollable.js +233 -0
  152. package/src/BookReader/ImageCache.js +49 -16
  153. package/src/BookReader/Mode1Up.js +66 -365
  154. package/src/BookReader/Mode1UpLit.js +392 -0
  155. package/src/BookReader/Mode2Up.js +87 -1315
  156. package/src/BookReader/Mode2UpLit.js +786 -0
  157. package/src/BookReader/ModeAbstract.js +43 -0
  158. package/src/BookReader/ModeCoordinateSpace.js +29 -0
  159. package/src/BookReader/ModeSmoothZoom.js +312 -0
  160. package/src/BookReader/ModeThumb.js +29 -15
  161. package/src/BookReader/Navbar/Navbar.js +201 -76
  162. package/src/BookReader/PageContainer.js +120 -23
  163. package/src/BookReader/ReduceSet.js +2 -2
  164. package/src/BookReader/Toolbar/Toolbar.js +18 -40
  165. package/src/BookReader/events.js +3 -3
  166. package/src/BookReader/options.js +94 -17
  167. package/src/BookReader/utils/HTMLDimensionsCacher.js +44 -0
  168. package/src/BookReader/utils/ScrollClassAdder.js +31 -0
  169. package/src/BookReader/utils/SelectionObserver.js +53 -0
  170. package/src/BookReader/utils/classes.js +1 -1
  171. package/src/BookReader/utils.js +136 -12
  172. package/src/BookReader.js +695 -1228
  173. package/src/BookReaderPlugin.js +52 -0
  174. package/src/assets/icons/magnify-minus.svg +3 -7
  175. package/src/assets/icons/magnify-plus.svg +3 -7
  176. package/src/assets/icons/slider-toggle.svg +1 -0
  177. package/src/assets/icons/voice.svg +1 -0
  178. package/src/assets/images/hypothesis.ico +0 -0
  179. package/src/assets/images/icon_experiment.svg +1 -0
  180. package/src/assets/images/translate.svg +1 -0
  181. package/src/assets/images/unviewable_page.png +0 -0
  182. package/src/assets/silence.mp3 +0 -0
  183. package/src/css/BookReader.scss +1 -5
  184. package/src/css/_BRBookmarks.scss +1 -1
  185. package/src/css/_BRComponent.scss +1 -1
  186. package/src/css/_BRicon.scss +8 -2
  187. package/src/css/_BRmain.scss +16 -3
  188. package/src/css/_BRnav.scss +74 -70
  189. package/src/css/_BRpages.scss +171 -42
  190. package/src/css/_BRsearch.scss +69 -30
  191. package/src/css/_BRtoolbar.scss +5 -5
  192. package/src/css/_TextSelection.scss +188 -24
  193. package/src/css/_colorbox.scss +2 -2
  194. package/src/css/_controls.scss +24 -7
  195. package/src/css/_icons.scss +8 -1
  196. package/src/{BookNavigator/assets → css}/button-base.js +2 -2
  197. package/src/css/icon_checkmark.js +9 -0
  198. package/src/css/sharedStyles.js +15 -0
  199. package/src/ia-bookreader/downloads/downloads-provider.js +81 -0
  200. package/src/{BookNavigator → ia-bookreader}/downloads/downloads.js +25 -5
  201. package/src/ia-bookreader/ia-bookreader.js +666 -0
  202. package/src/ia-bookreader/sharing.js +27 -0
  203. package/src/ia-bookreader/viewable-files.js +98 -0
  204. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments-provider.js +17 -17
  205. package/src/{BookNavigator → ia-bookreader}/visual-adjustments/visual-adjustments.js +75 -67
  206. package/src/{BookNavigator → plugins}/bookmarks/bookmark-button.js +4 -3
  207. package/src/{BookNavigator/assets → plugins/bookmarks}/bookmark-colors.js +1 -1
  208. package/src/{BookNavigator → plugins}/bookmarks/bookmark-edit.js +43 -31
  209. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-list.js +48 -49
  210. package/src/{BookNavigator → plugins}/bookmarks/bookmarks-loginCTA.js +3 -3
  211. package/src/plugins/bookmarks/bookmarks-provider.js +63 -0
  212. package/src/{BookNavigator → plugins/bookmarks}/delete-modal-actions.js +1 -1
  213. package/src/{BookNavigator → plugins}/bookmarks/ia-bookmarks.js +117 -68
  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 +319 -205
  217. package/src/plugins/plugin.experiments.js +339 -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 +539 -219
  222. package/src/plugins/plugin.vendor-fullscreen.js +5 -5
  223. package/src/plugins/search/plugin.search.js +374 -392
  224. package/src/{BookNavigator → plugins}/search/search-provider.js +59 -27
  225. package/src/{BookNavigator → plugins}/search/search-results.js +105 -76
  226. package/src/plugins/search/utils.js +50 -0
  227. package/src/plugins/search/view.js +50 -68
  228. package/src/plugins/translate/TranslationManager.js +164 -0
  229. package/src/plugins/translate/plugin.translate.js +512 -0
  230. package/src/plugins/tts/AbstractTTSEngine.js +78 -49
  231. package/src/plugins/tts/FestivalTTSEngine.js +20 -30
  232. package/src/plugins/tts/PageChunk.js +33 -21
  233. package/src/plugins/tts/PageChunkIterator.js +11 -17
  234. package/src/plugins/tts/WebTTSEngine.js +131 -91
  235. package/src/plugins/tts/plugin.tts.js +345 -350
  236. package/src/plugins/tts/utils.js +77 -49
  237. package/src/plugins/url/UrlPlugin.js +211 -0
  238. package/src/plugins/{plugin.url.js → url/plugin.url.js} +105 -20
  239. package/src/util/TextSelectionManager.js +532 -0
  240. package/src/util/browserSniffing.js +33 -1
  241. package/src/util/cache.js +20 -0
  242. package/src/util/docCookies.js +21 -2
  243. package/src/util/lit.js +15 -0
  244. package/src/util/strings.js +1 -0
  245. package/.babelrc +0 -12
  246. package/.dependabot/config.yml +0 -6
  247. package/.eslintrc.js +0 -50
  248. package/.gitattributes +0 -2
  249. package/.github/ISSUE_TEMPLATE/bug.md +0 -32
  250. package/.github/ISSUE_TEMPLATE/feature-request.md +0 -30
  251. package/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md +0 -15
  252. package/.github/workflows/node.js.yml +0 -37
  253. package/.github/workflows/npm-publish.yml +0 -47
  254. package/.testcaferc.json +0 -5
  255. package/BookReader/bookreader-component-bundle.js +0 -1450
  256. package/BookReader/bookreader-component-bundle.js.LICENSE.txt +0 -38
  257. package/BookReader/bookreader-component-bundle.js.map +0 -1
  258. package/BookReader/jquery-1.10.1.js +0 -2
  259. package/BookReader/jquery-1.10.1.js.LICENSE.txt +0 -24
  260. package/BookReader/plugins/plugin.menu_toggle.js +0 -2
  261. package/BookReader/plugins/plugin.menu_toggle.js.map +0 -1
  262. package/BookReader/plugins/plugin.mobile_nav.js +0 -2
  263. package/BookReader/plugins/plugin.mobile_nav.js.map +0 -1
  264. package/BookReaderDemo/BookReaderDemo.css +0 -41
  265. package/BookReaderDemo/BookReaderJSAdvanced.js +0 -115
  266. package/BookReaderDemo/BookReaderJSAutoplay.js +0 -56
  267. package/BookReaderDemo/BookReaderJSSimple.js +0 -55
  268. package/BookReaderDemo/IIIFBookReader.js +0 -207
  269. package/BookReaderDemo/assets/v5/Bookreader-logo-cool-grad.svg +0 -1
  270. package/BookReaderDemo/assets/v5/Bookreader-logo-flat.svg +0 -1
  271. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-cool-grad.png +0 -0
  272. package/BookReaderDemo/assets/v5/Bookreader-logo-hex-flat.png +0 -0
  273. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.png +0 -0
  274. package/BookReaderDemo/assets/v5/Bookreader-logo-lines.svg +0 -1
  275. package/BookReaderDemo/assets/v5/Bookreader-logo-warm.svg +0 -1
  276. package/BookReaderDemo/assets/v5/bookreader-logo-renders@1x.png +0 -0
  277. package/BookReaderDemo/assets/v5/bookreader-logo-renders@2x.png +0 -0
  278. package/BookReaderDemo/assets/v5/bookreader-v5-screenshot.png +0 -0
  279. package/BookReaderDemo/bookreader-template-bundle.js +0 -7178
  280. package/BookReaderDemo/demo-advanced.html +0 -33
  281. package/BookReaderDemo/demo-autoplay.html +0 -38
  282. package/BookReaderDemo/demo-embed-iframe-src.html +0 -84
  283. package/BookReaderDemo/demo-embed.html +0 -26
  284. package/BookReaderDemo/demo-fullscreen-mobile.html +0 -36
  285. package/BookReaderDemo/demo-fullscreen.html +0 -33
  286. package/BookReaderDemo/demo-iiif.html +0 -34
  287. package/BookReaderDemo/demo-iiif.js +0 -26
  288. package/BookReaderDemo/demo-internetarchive.html +0 -74
  289. package/BookReaderDemo/demo-multiple.html +0 -43
  290. package/BookReaderDemo/demo-plugin-menu-toggle.html +0 -34
  291. package/BookReaderDemo/demo-preview-pages.html +0 -1092
  292. package/BookReaderDemo/demo-simple.html +0 -34
  293. package/BookReaderDemo/demo-vendor-fullscreen.html +0 -36
  294. package/BookReaderDemo/immersion-1up.html +0 -64
  295. package/BookReaderDemo/immersion-mode.html +0 -35
  296. package/BookReaderDemo/toggle_controls.html +0 -53
  297. package/BookReaderDemo/view_mode.html +0 -39
  298. package/BookReaderDemo/viewmode-cycle.html +0 -41
  299. package/CHANGELOG.md +0 -495
  300. package/CONTRIBUTING.md +0 -7
  301. package/codecov.yml +0 -17
  302. package/index.html +0 -31
  303. package/karma.conf.js +0 -23
  304. package/screenshot.png +0 -0
  305. package/scripts/postversion.js +0 -10
  306. package/scripts/preversion.js +0 -14
  307. package/scripts/version.js +0 -26
  308. package/src/BookNavigator/BookModel.js +0 -14
  309. package/src/BookNavigator/BookNavigator.js +0 -446
  310. package/src/BookNavigator/assets/book-loader.js +0 -27
  311. package/src/BookNavigator/assets/icon_checkmark.js +0 -6
  312. package/src/BookNavigator/assets/icon_close.js +0 -3
  313. package/src/BookNavigator/bookmarks/bookmarks-provider.js +0 -53
  314. package/src/BookNavigator/br-fullscreen-mgr.js +0 -83
  315. package/src/BookNavigator/downloads/downloads-provider.js +0 -66
  316. package/src/BookNavigator/search/a-search-result.js +0 -55
  317. package/src/BookReader/DebugConsole.js +0 -54
  318. package/src/BookReaderComponent/BookReaderComponent.js +0 -112
  319. package/src/ItemNavigator/ItemNavigator.js +0 -376
  320. package/src/ItemNavigator/providers/sharing.js +0 -29
  321. package/src/css/_MobileNav.scss +0 -194
  322. package/src/dragscrollable-br.js +0 -261
  323. package/src/plugins/menu_toggle/plugin.menu_toggle.js +0 -324
  324. package/src/plugins/plugin.mobile_nav.js +0 -287
  325. package/tests/BookReader/BookModel.test.js +0 -312
  326. package/tests/BookReader/BookReaderPublicFunctions.test.js +0 -171
  327. package/tests/BookReader/DebugConsole.test.js +0 -25
  328. package/tests/BookReader/ImageCache.test.js +0 -150
  329. package/tests/BookReader/Mode1Up.test.js +0 -164
  330. package/tests/BookReader/Mode2Up.test.js +0 -247
  331. package/tests/BookReader/Navbar/Navbar.test.js +0 -169
  332. package/tests/BookReader/PageContainer.test.js +0 -115
  333. package/tests/BookReader/ReduceSet.test.js +0 -38
  334. package/tests/BookReader/Toolbar/Toolbar.test.js +0 -26
  335. package/tests/BookReader/utils/classes.test.js +0 -88
  336. package/tests/BookReader/utils.test.js +0 -109
  337. package/tests/BookReader.options.test.js +0 -39
  338. package/tests/BookReader.test.js +0 -301
  339. package/tests/e2e/README.md +0 -75
  340. package/tests/e2e/autoplay.test.js +0 -13
  341. package/tests/e2e/base.test.js +0 -35
  342. package/tests/e2e/helpers/base.js +0 -263
  343. package/tests/e2e/helpers/debug.js +0 -13
  344. package/tests/e2e/helpers/desktopSearch.js +0 -72
  345. package/tests/e2e/helpers/mobileSearch.js +0 -85
  346. package/tests/e2e/helpers/mockSearch.js +0 -93
  347. package/tests/e2e/helpers/rightToLeft.js +0 -29
  348. package/tests/e2e/ia-production/ia-prod-base.js +0 -17
  349. package/tests/e2e/models/BookReader.js +0 -11
  350. package/tests/e2e/models/Navigation.js +0 -56
  351. package/tests/e2e/rightToLeft.test.js +0 -20
  352. package/tests/e2e/viewmode.test.js +0 -37
  353. package/tests/karma/BookNavigator/book-navigator.test.js +0 -132
  354. package/tests/karma/BookNavigator/bookmarks/bookmark-edit.test.js +0 -133
  355. package/tests/karma/BookNavigator/bookmarks/bookmarks-list.test.js +0 -222
  356. package/tests/karma/BookNavigator/search/search-provider.test.js +0 -23
  357. package/tests/karma/BookNavigator/search/search-results.test.js +0 -240
  358. package/tests/karma/BookNavigator/visual-adjustments.test.js +0 -201
  359. package/tests/plugins/menu_toggle/plugin.menu_toggle.test.js +0 -68
  360. package/tests/plugins/plugin.archive_analytics.test.js +0 -23
  361. package/tests/plugins/plugin.autoplay.test.js +0 -52
  362. package/tests/plugins/plugin.chapters.test.js +0 -130
  363. package/tests/plugins/plugin.iframe.test.js +0 -42
  364. package/tests/plugins/plugin.mobile_nav.test.js +0 -66
  365. package/tests/plugins/plugin.resume.test.js +0 -98
  366. package/tests/plugins/plugin.text_selection.test.js +0 -203
  367. package/tests/plugins/plugin.url.test.js +0 -129
  368. package/tests/plugins/plugin.vendor-fullscreen.test.js +0 -65
  369. package/tests/plugins/search/plugin.search.test.js +0 -173
  370. package/tests/plugins/search/plugin.search.view.test.js +0 -106
  371. package/tests/plugins/tts/AbstractTTSEngine.test.js +0 -153
  372. package/tests/plugins/tts/FestivalTTSEngine.test.js +0 -59
  373. package/tests/plugins/tts/PageChunk.test.js +0 -57
  374. package/tests/plugins/tts/PageChunkIterator.test.js +0 -179
  375. package/tests/plugins/tts/WebTTSEngine.test.js +0 -126
  376. package/tests/plugins/tts/utils.test.js +0 -133
  377. package/tests/util/browserSniffing.test.js +0 -56
  378. package/tests/util/docCookies.test.js +0 -15
  379. package/tests/util/strings.test.js +0 -63
  380. package/tests/utils.js +0 -42
  381. 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
- }