@internetarchive/bookreader 5.0.0-82 → 5.0.0-83

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 (95) hide show
  1. package/.eslintrc.js +9 -9
  2. package/.github/workflows/node.js.yml +9 -7
  3. package/BookReader/BookReader.css +2 -2
  4. package/BookReader/BookReader.js +1 -1
  5. package/BookReader/BookReader.js.map +1 -1
  6. package/BookReader/ia-bookreader-bundle.js +32 -32
  7. package/BookReader/ia-bookreader-bundle.js.map +1 -1
  8. package/BookReader/plugins/plugin.archive_analytics.js.map +1 -1
  9. package/BookReader/plugins/plugin.autoplay.js.map +1 -1
  10. package/BookReader/plugins/plugin.chapters.js +1 -1
  11. package/BookReader/plugins/plugin.chapters.js.map +1 -1
  12. package/BookReader/plugins/plugin.iframe.js.map +1 -1
  13. package/BookReader/plugins/plugin.iiif.js +1 -1
  14. package/BookReader/plugins/plugin.iiif.js.map +1 -1
  15. package/BookReader/plugins/plugin.search.js +1 -1
  16. package/BookReader/plugins/plugin.search.js.map +1 -1
  17. package/BookReader/plugins/plugin.text_selection.js +1 -1
  18. package/BookReader/plugins/plugin.text_selection.js.map +1 -1
  19. package/BookReader/plugins/plugin.tts.js +1 -1
  20. package/BookReader/plugins/plugin.tts.js.map +1 -1
  21. package/BookReader/plugins/plugin.url.js +1 -1
  22. package/BookReader/plugins/plugin.url.js.map +1 -1
  23. package/BookReader/plugins/plugin.vendor-fullscreen.js.map +1 -1
  24. package/BookReaderDemo/IADemoBr.js +10 -3
  25. package/BookReaderDemo/demo-iiif.html +1 -1
  26. package/BookReaderDemo/demo-internetarchive.html +1 -1
  27. package/CHANGELOG.md +12 -0
  28. package/babel.config.js +5 -5
  29. package/package.json +16 -18
  30. package/renovate.json +1 -1
  31. package/src/BookNavigator/book-navigator.js +8 -8
  32. package/src/BookNavigator/bookmarks/bookmarks-loginCTA.js +1 -1
  33. package/src/BookNavigator/bookmarks/bookmarks-provider.js +1 -1
  34. package/src/BookNavigator/bookmarks/ia-bookmarks.js +1 -1
  35. package/src/BookNavigator/downloads/downloads.js +1 -1
  36. package/src/BookNavigator/search/search-provider.js +2 -2
  37. package/src/BookNavigator/search/search-results.js +1 -1
  38. package/src/BookNavigator/sharing.js +1 -1
  39. package/src/BookNavigator/viewable-files.js +1 -1
  40. package/src/BookNavigator/visual-adjustments/visual-adjustments.js +3 -3
  41. package/src/BookReader/BookModel.js +1 -1
  42. package/src/BookReader/DragScrollable.js +2 -2
  43. package/src/BookReader/ModeSmoothZoom.js +5 -5
  44. package/src/BookReader/ModeThumb.js +2 -2
  45. package/src/BookReader/Navbar/Navbar.js +4 -4
  46. package/src/BookReader/ReduceSet.js +2 -2
  47. package/src/BookReader/Toolbar/Toolbar.js +4 -4
  48. package/src/BookReader/options.js +10 -10
  49. package/src/BookReader/utils/classes.js +1 -1
  50. package/src/BookReader.js +12 -12
  51. package/src/css/_BRicon.scss +8 -2
  52. package/src/ia-bookreader/ia-bookreader.js +1 -1
  53. package/src/plugins/plugin.archive_analytics.js +1 -1
  54. package/src/plugins/plugin.autoplay.js +2 -2
  55. package/src/plugins/plugin.chapters.js +3 -3
  56. package/src/plugins/plugin.iframe.js +1 -1
  57. package/src/plugins/plugin.iiif.js +9 -5
  58. package/src/plugins/plugin.text_selection.js +2 -2
  59. package/src/plugins/plugin.vendor-fullscreen.js +3 -3
  60. package/src/plugins/search/plugin.search.js +16 -11
  61. package/src/plugins/search/view.js +4 -1
  62. package/src/plugins/tts/AbstractTTSEngine.js +1 -1
  63. package/src/plugins/tts/FestivalTTSEngine.js +3 -3
  64. package/src/plugins/tts/PageChunk.js +2 -2
  65. package/src/plugins/tts/WebTTSEngine.js +1 -1
  66. package/src/plugins/tts/plugin.tts.js +1 -1
  67. package/src/plugins/tts/utils.js +1 -1
  68. package/src/plugins/url/plugin.url.js +1 -1
  69. package/tests/e2e/helpers/mockSearch.js +13 -13
  70. package/tests/jest/BookNavigator/book-navigator.test.js +27 -27
  71. package/tests/jest/BookNavigator/downloads/downloads-provider.test.js +5 -5
  72. package/tests/jest/BookNavigator/downloads/downloads.test.js +3 -3
  73. package/tests/jest/BookNavigator/search/search-provider.test.js +15 -15
  74. package/tests/jest/BookNavigator/search/search-results.test.js +1 -1
  75. package/tests/jest/BookNavigator/sharing/sharing-provider.test.js +5 -5
  76. package/tests/jest/BookNavigator/viewable-files/viewable-files-provider.test.js +8 -8
  77. package/tests/jest/BookReader/BookReaderPublicFunctions.test.js +3 -3
  78. package/tests/jest/BookReader/Mode1UpLit.test.js +2 -2
  79. package/tests/jest/BookReader/Mode2UpLit.test.js +3 -3
  80. package/tests/jest/BookReader/ModeSmoothZoom.test.js +4 -4
  81. package/tests/jest/BookReader/Navbar/Navbar.test.js +16 -16
  82. package/tests/jest/BookReader/Toolbar/Toolbar.test.js +1 -1
  83. package/tests/jest/BookReader.keyboard.test.js +1 -1
  84. package/tests/jest/BookReader.options.test.js +1 -1
  85. package/tests/jest/BookReader.test.js +4 -4
  86. package/tests/jest/plugins/plugin.chapters.test.js +3 -3
  87. package/tests/jest/plugins/plugin.iframe.test.js +2 -2
  88. package/tests/jest/plugins/plugin.text_selection.test.js +1 -1
  89. package/tests/jest/plugins/search/plugin.search.view.test.js +6 -6
  90. package/tests/jest/plugins/search/utils.js +3 -3
  91. package/tests/jest/plugins/tts/AbstractTTSEngine.test.js +1 -1
  92. package/tests/jest/plugins/tts/WebTTSEngine.test.js +2 -2
  93. package/tests/jest/plugins/url/UrlPlugin.test.js +2 -2
  94. package/tests/jest/plugins/url/plugin.url.test.js +6 -6
  95. package/webpack.config.js +6 -6
@@ -7,20 +7,20 @@ const downloadableTypes = [
7
7
  ["ePub", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub"],
8
8
  ["Plain Text", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_djvu.txt"],
9
9
  ["DAISY", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala_daisy.zip"],
10
- ["Kindle", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.mobi"]
10
+ ["Kindle", "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.mobi"],
11
11
  ];
12
12
 
13
13
  const downloads = [
14
14
  {
15
15
  type: "PDF",
16
16
  url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
17
- note: "PDF files contain high quality images of pages."
17
+ note: "PDF files contain high quality images of pages.",
18
18
  },
19
19
  {
20
20
  type: "ePub",
21
21
  url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
22
- note: "ePub files are smaller in size, but may contain errors."
23
- }
22
+ note: "ePub files are smaller in size, but may contain errors.",
23
+ },
24
24
  ];
25
25
 
26
26
  afterEach(() => {
@@ -52,7 +52,7 @@ describe('Downloads Provider', () => {
52
52
 
53
53
  test('render view if book is protected', () => {
54
54
  const provider = new DownloadsProvider({
55
- bookreader: { options: { isProtected: true } }
55
+ bookreader: { options: { isProtected: true } },
56
56
  });
57
57
 
58
58
  expect(provider.isBookProtected).toEqual(true);
@@ -11,13 +11,13 @@ const downloads = [
11
11
  {
12
12
  type: "PDF",
13
13
  url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.pdf",
14
- note: "PDF files contain high quality images of pages."
14
+ note: "PDF files contain high quality images of pages.",
15
15
  },
16
16
  {
17
17
  type: "ePub",
18
18
  url: "//archive.org/download/theworksofplato01platiala/theworksofplato01platiala.epub",
19
- note: "ePub files are smaller in size, but may contain errors."
20
- }
19
+ note: "ePub files are smaller in size, but may contain errors.",
20
+ },
21
21
  ];
22
22
 
23
23
 
@@ -11,7 +11,7 @@ describe('Search Provider', () => {
11
11
  describe('constructor', () => {
12
12
  const provider = new searchProvider({
13
13
  onProviderChange: sinon.fake(),
14
- bookreader: {}
14
+ bookreader: {},
15
15
  });
16
16
 
17
17
  expect(provider.bookreader).toBeDefined();
@@ -27,7 +27,7 @@ describe('Search Provider', () => {
27
27
  test('Event: catches `BookReader:SearchStarted`', async() => {
28
28
  const provider = new searchProvider({
29
29
  onProviderChange: sinon.fake(),
30
- bookreader: {}
30
+ bookreader: {},
31
31
  });
32
32
  sinon.spy(provider, 'updateMenu');
33
33
  window.dispatchEvent(new CustomEvent('BookReader:SearchStarted', { detail: { props: { term: 'foo' }}}));
@@ -36,7 +36,7 @@ describe('Search Provider', () => {
36
36
  test('Event: catches `BookReader:SearchCallback`', async() => {
37
37
  const provider = new searchProvider({
38
38
  onProviderChange: sinon.fake(),
39
- bookreader: {}
39
+ bookreader: {},
40
40
  });
41
41
  sinon.spy(provider, 'updateMenu');
42
42
  const brStub = {};
@@ -47,7 +47,7 @@ describe('Search Provider', () => {
47
47
  test('Event: catches `BookReader:SearchCallbackEmpty`', async() => {
48
48
  const provider = new searchProvider({
49
49
  onProviderChange: sinon.fake(),
50
- bookreader: {}
50
+ bookreader: {},
51
51
  });
52
52
  sinon.spy(provider, 'onSearchRequestError');
53
53
  sinon.spy(provider, 'updateMenu');
@@ -60,7 +60,7 @@ describe('Search Provider', () => {
60
60
  test('Event: catches `BookReader:SearchCallbackNotIndexed`', async() => {
61
61
  const provider = new searchProvider({
62
62
  onProviderChange: sinon.fake(),
63
- bookreader: {}
63
+ bookreader: {},
64
64
  });
65
65
  const brStub = {};
66
66
  sinon.spy(provider, 'onSearchRequestError');
@@ -73,7 +73,7 @@ describe('Search Provider', () => {
73
73
  test('Event: catches `BookReader:SearchCallbackError`', async() => {
74
74
  const provider = new searchProvider({
75
75
  onProviderChange: sinon.fake(),
76
- bookreader: {}
76
+ bookreader: {},
77
77
  });
78
78
  sinon.spy(provider, 'onSearchRequestError');
79
79
  sinon.spy(provider, 'updateMenu');
@@ -88,8 +88,8 @@ describe('Search Provider', () => {
88
88
  onProviderChange: sinon.fake(),
89
89
  bookreader: {
90
90
  leafNumToIndex: sinon.fake(),
91
- _searchPluginGoToResult: sinon.fake()
92
- }
91
+ _searchPluginGoToResult: sinon.fake(),
92
+ },
93
93
  });
94
94
 
95
95
  const searchResultStub = {
@@ -97,7 +97,7 @@ describe('Search Provider', () => {
97
97
  };
98
98
  fixtureSync(provider.component).dispatchEvent(
99
99
  new CustomEvent('resultSelected',
100
- { detail: searchResultStub })
100
+ { detail: searchResultStub }),
101
101
  );
102
102
 
103
103
  expect(provider.bookreader._searchPluginGoToResult.callCount).toEqual(1);
@@ -105,15 +105,15 @@ describe('Search Provider', () => {
105
105
  test('update url when search is cancelled or input cleared', async() => {
106
106
  const urlPluginMock = {
107
107
  pullFromAddressBar: sinon.fake(),
108
- removeUrlParam: sinon.fake()
108
+ removeUrlParam: sinon.fake(),
109
109
  };
110
110
  const provider = new searchProvider({
111
111
  onProviderChange: sinon.fake(),
112
112
  bookreader: {
113
113
  leafNumToIndex: sinon.fake(),
114
114
  _searchPluginGoToResult: sinon.fake(),
115
- urlPlugin: urlPluginMock
116
- }
115
+ urlPlugin: urlPluginMock,
116
+ },
117
117
  });
118
118
 
119
119
  provider.onSearchCanceled();
@@ -139,7 +139,7 @@ describe('Search Provider', () => {
139
139
  fieldToSet = field;
140
140
  valueOfFieldToSet = val;
141
141
  setUrlParamCalled = true;
142
- }
142
+ },
143
143
  };
144
144
  const provider = new searchProvider({
145
145
  onProviderChange: sinon.fake(),
@@ -147,8 +147,8 @@ describe('Search Provider', () => {
147
147
  leafNumToIndex: sinon.fake(),
148
148
  _searchPluginGoToResult: sinon.fake(),
149
149
  urlPlugin: urlPluginMock,
150
- search: sinon.fake()
151
- }
150
+ search: sinon.fake(),
151
+ },
152
152
  });
153
153
 
154
154
  const searchInitiatedEvent = new CustomEvent('bookSearchInitiated', { detail: { query: 'foobar' } });
@@ -44,7 +44,7 @@ const results = [{
44
44
  l: 432,
45
45
  page_height: 5357,
46
46
  page: 86,
47
- }]
47
+ }],
48
48
  }];
49
49
 
50
50
  marshallSearchResults({ matches: results }, () => '', '{{{', '}}}');
@@ -11,7 +11,7 @@ const item = {
11
11
  identifier: 'stubby-id',
12
12
  creator: 'mr. big',
13
13
  title: 'Stubby title',
14
- }
14
+ },
15
15
  };
16
16
 
17
17
  const baseHost = 'foo.org';
@@ -23,8 +23,8 @@ describe('Sharing Provider', () => {
23
23
  item,
24
24
  baseHost,
25
25
  bookreader: {
26
- options: { subPrefix }
27
- }
26
+ options: { subPrefix },
27
+ },
28
28
  });
29
29
 
30
30
  expect(provider.id).toEqual('share');
@@ -39,8 +39,8 @@ describe('Sharing Provider', () => {
39
39
  item,
40
40
  baseHost,
41
41
  bookreader: {
42
- options: { subPrefix }
43
- }
42
+ options: { subPrefix },
43
+ },
44
44
  });
45
45
 
46
46
  expect(fixtureSync(provider.component).fileSubPrefix).toEqual(subPrefix);
@@ -13,25 +13,25 @@ const brOptions = {
13
13
  "file_subprefix": "book1/GPORFP",
14
14
  "orig_sort": 1,
15
15
  "title": "book1/GPORFP.pdf",
16
- "file_source": "/book1/GPORFP_jp2.zip"
16
+ "file_source": "/book1/GPORFP_jp2.zip",
17
17
  },
18
18
  "/details/SubBookTest/subdir/book2/brewster_kahle_internet_archive": {
19
19
  "url_path": "/details/SubBookTest/subdir/book2/brewster_kahle_internet_archive",
20
20
  "file_subprefix": "subdir/book2/brewster_kahle_internet_archive",
21
21
  "orig_sort": 2,
22
22
  "title": "subdir/book2/brewster_kahle_internet_archive.pdf",
23
- "file_source": "/subdir/book2/brewster_kahle_internet_archive_jp2.zip"
23
+ "file_source": "/subdir/book2/brewster_kahle_internet_archive_jp2.zip",
24
24
  },
25
25
  "/details/SubBookTest/subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume": {
26
26
  "url_path": "/details/SubBookTest/subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume",
27
27
  "file_subprefix": "subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume",
28
28
  "orig_sort": 3,
29
29
  "title": "subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume.pdf",
30
- "file_source": "/subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume_jp2.zip"
31
- }
32
- }
33
- }
34
- }
30
+ "file_source": "/subdir/subsubdir/book3/Rfp008011ResponseInternetArchive-without-resume_jp2.zip",
31
+ },
32
+ },
33
+ },
34
+ },
35
35
  };
36
36
 
37
37
  afterEach(() => {
@@ -47,7 +47,7 @@ describe('Volumes Provider', () => {
47
47
  const provider = new ViewableFilesProvider({
48
48
  baseHost,
49
49
  bookreader: brOptions,
50
- onProviderChange
50
+ onProviderChange,
51
51
  });
52
52
 
53
53
  const files = brOptions.options.multipleBooksList.by_subprefix;
@@ -31,14 +31,14 @@ describe('BookReader.prototype.toggleFullscreen', () => {
31
31
  br.jumpToIndex = sinon.fake();
32
32
  br.refs.$brContainer = {
33
33
  css: sinon.fake(),
34
- animate: (options, speed, style, callback) => callback()
34
+ animate: (options, speed, style, callback) => callback(),
35
35
  };
36
36
  br.refs.$br = {
37
37
  updateBrClasses: sinon.fake(),
38
38
  removeClass: sinon.fake(),
39
39
  addClass: sinon.fake(),
40
40
  css: sinon.fake(),
41
- animate: (options, speed, style, callback) => callback()
41
+ animate: (options, speed, style, callback) => callback(),
42
42
  };
43
43
 
44
44
  await br.toggleFullscreen();
@@ -124,7 +124,7 @@ describe('BookReader.prototype.exitFullScreen', () => {
124
124
  };
125
125
  br.refs.$brContainer = {
126
126
  css: sinon.fake(),
127
- animate: (options, speed, style, callback) => callback()
127
+ animate: (options, speed, style, callback) => callback(),
128
128
  };
129
129
  await br.exitFullScreen();
130
130
  expect(br.switchMode.callCount).toEqual(1);
@@ -25,9 +25,9 @@ function make_dummy_br(overrides = {}) {
25
25
  _components: {
26
26
  navbar: {
27
27
  updateNavIndexThrottled() {},
28
- }
28
+ },
29
29
  },
30
- data: []
30
+ data: [],
31
31
  }, overrides);
32
32
  }
33
33
 
@@ -116,7 +116,7 @@ describe("computePositions", () => {
116
116
  leafEdgesRightEnd: 0.252,
117
117
  leafEdgesRightFullWidth: 0.006,
118
118
  spreadWidth: 0.492,
119
- bookWidth: 0.498
119
+ bookWidth: 0.498,
120
120
  };
121
121
  const SPREAD_EXPECTED = {
122
122
  leafEdgesLeftStart: -0.246,
@@ -139,7 +139,7 @@ describe("computePositions", () => {
139
139
  leafEdgesRightEnd: 0.252,
140
140
  leafEdgesRightFullWidth: 0.004,
141
141
  spreadWidth: 0.492,
142
- bookWidth: 0.498
142
+ bookWidth: 0.498,
143
143
  };
144
144
  const RIGHT_COVER_EXPECTED = {
145
145
  leafEdgesLeftStart: -0.242,
@@ -162,7 +162,7 @@ describe("computePositions", () => {
162
162
  leafEdgesRightEnd: 0.01,
163
163
  leafEdgesRightFullWidth: 0,
164
164
  spreadWidth: 0.246,
165
- bookWidth: 0.252
165
+ bookWidth: 0.252,
166
166
  };
167
167
 
168
168
  test("left cover page", () => {
@@ -19,7 +19,7 @@ function dummy_mode(overrides = {}) {
19
19
  boundingClientRect: { left: 0, top: 0 },
20
20
  },
21
21
  scaleCenter: {x: 0.5, y: 0.5},
22
- ...overrides
22
+ ...overrides,
23
23
  };
24
24
  }
25
25
 
@@ -75,9 +75,9 @@ describe('ModeSmoothZoom', () => {
75
75
  clientHeight: 100,
76
76
  boundingClientRect: {
77
77
  left: 5,
78
- top: 50
79
- }
80
- }
78
+ top: 50,
79
+ },
80
+ },
81
81
  });
82
82
  const msz = new ModeSmoothZoom(mode);
83
83
  expect(msz.scaleCenter).toEqual({ x: 0.5, y: 0.5 });
@@ -40,7 +40,7 @@ beforeEach(() => {
40
40
  uri: '//archive.org/download/BookReader/img/page004.jpg' },
41
41
  { width: 800, height: 1200,
42
42
  uri: '//archive.org/download/BookReader/img/page005.jpg' },
43
- ]
43
+ ],
44
44
  ],
45
45
  });
46
46
  br.init();
@@ -89,8 +89,8 @@ describe('Navbar controls overrides', () => {
89
89
  visible: true,
90
90
  className: 'viewmode',
91
91
  excludedModes: [1],
92
- }
93
- }
92
+ },
93
+ },
94
94
  };
95
95
  createBRWithOverrides(overrides);
96
96
 
@@ -107,9 +107,9 @@ describe('Navbar controls overrides', () => {
107
107
  const overrides = {
108
108
  controls: {
109
109
  onePage: {
110
- visible: false
111
- }
112
- }
110
+ visible: false,
111
+ },
112
+ },
113
113
  };
114
114
  createBRWithOverrides(overrides);
115
115
 
@@ -122,9 +122,9 @@ describe('Navbar controls overrides', () => {
122
122
  const overrides = {
123
123
  controls: {
124
124
  onePage: {
125
- className: 'foo'
126
- }
127
- }
125
+ className: 'foo',
126
+ },
127
+ },
128
128
  };
129
129
  createBRWithOverrides(overrides);
130
130
 
@@ -139,9 +139,9 @@ describe('Navbar controls overrides', () => {
139
139
  onePage: {
140
140
  template: () => (
141
141
  '<button id="foo"></button>'
142
- )
143
- }
144
- }
142
+ ),
143
+ },
144
+ },
145
145
  };
146
146
  createBRWithOverrides(overrides);
147
147
 
@@ -154,12 +154,12 @@ describe('Navbar controls overrides', () => {
154
154
  const overrides = {
155
155
  controls: {
156
156
  viewmode: {
157
- visible: true
157
+ visible: true,
158
158
  },
159
159
  onePage: {
160
- visible: false
161
- }
162
- }
160
+ visible: false,
161
+ },
162
+ },
163
163
  };
164
164
  createBRWithOverrides(overrides);
165
165
 
@@ -20,7 +20,7 @@ describe('createPopup', () => {
20
20
  expect(openStub.args[0]).toEqual([
21
21
  'openlibrary.org',
22
22
  'Open Library',
23
- 'status=1,width=100,height=100,top=334,left=462'
23
+ 'status=1,width=100,height=100,top=334,left=462',
24
24
  ]);
25
25
  });
26
26
  });
@@ -17,7 +17,7 @@ afterEach(() => {
17
17
  test('Initialzation enables IntersectionObserver and defaults', () => {
18
18
  const observe = jest.fn();
19
19
  window.IntersectionObserver = jest.fn(() => ({
20
- observe
20
+ observe,
21
21
  }));
22
22
  br.init();
23
23
  expect(br.hasKeyFocus).toBe(true);
@@ -21,7 +21,7 @@ describe('BookReader options', () => {
21
21
  describe('`startFullscreen`', () => {
22
22
  it('initializes BookReader to fullscreen', () => {
23
23
  const br = new BookReader({
24
- startFullscreen: true
24
+ startFullscreen: true,
25
25
  });
26
26
  br.init();
27
27
 
@@ -137,7 +137,7 @@ test('adds q= term to urlMode=history query string', () => {
137
137
  expect(br.queryStringFromParams(
138
138
  { search: 'test value' },
139
139
  'name=value',
140
- 'history'
140
+ 'history',
141
141
  )).toBe('?name=value&q=test+value');
142
142
  });
143
143
 
@@ -145,7 +145,7 @@ test('replaces q= term in urlMode=history query string', () => {
145
145
  expect(br.queryStringFromParams(
146
146
  { search: 'test+value' },
147
147
  'q=foo&a=1&b=2&c=3',
148
- 'history'
148
+ 'history',
149
149
  )).toBe('?q=test%2Bvalue&a=1&b=2&c=3');
150
150
  });
151
151
 
@@ -153,7 +153,7 @@ test('does not add q= term to urlMode=hash query string', () => {
153
153
  expect(br.queryStringFromParams(
154
154
  { search: 'test value' },
155
155
  'name=value',
156
- 'hash'
156
+ 'hash',
157
157
  )).toBe('?name=value');
158
158
  });
159
159
 
@@ -228,7 +228,7 @@ describe('nextReduce', () => {
228
228
  // auto doesn't get read by nextReduce (bug)
229
229
  // It looks like width/height are set for 1up, and auto is set for 2up,
230
230
  // and neither is set for thumb
231
- { reduce: 6.2, autofit: "auto" }
231
+ { reduce: 6.2, autofit: "auto" },
232
232
  ];
233
233
 
234
234
  const currentReduces = [
@@ -71,7 +71,7 @@ afterEach(() => {
71
71
  describe("BRChaptersPlugin", () => {
72
72
  beforeEach(() => {
73
73
  sinon.stub(BookModel.prototype, "getPageIndex").callsFake((str) =>
74
- parseFloat(str)
74
+ parseFloat(str),
75
75
  );
76
76
  });
77
77
 
@@ -159,7 +159,7 @@ describe("BRChaptersPlugin", () => {
159
159
  menuProviders: {},
160
160
  addMenuShortcut: sinon.stub(),
161
161
  updateMenuContents: sinon.stub(),
162
- }
162
+ },
163
163
  };
164
164
  BookReader.prototype._chaptersRender.call(fakeBR);
165
165
  expect(fakeBR.shell.menuProviders['chapters']).toBeTruthy();
@@ -178,7 +178,7 @@ describe("BRChaptersPlugin", () => {
178
178
  _tocEntries: SAMPLE_TOC,
179
179
  _chaptersPanel: {
180
180
  currentChapter: null,
181
- }
181
+ },
182
182
  };
183
183
  BookReader.prototype._chaptersUpdateCurrent.call(fakeBR);
184
184
  expect(fakeBR._chaptersPanel.currentChapter).toEqual(SAMPLE_TOC[1]);
@@ -35,8 +35,8 @@ test('updates params when window receives a message', () => {
35
35
  window.dispatchEvent(new MessageEvent('message', {
36
36
  data: {
37
37
  type: 'bookReaderFragmentChange',
38
- fragment: ''
39
- }
38
+ fragment: '',
39
+ },
40
40
  }));
41
41
  expect(br.updateFromParams.callCount).toBe(1);
42
42
  });
@@ -104,7 +104,7 @@ describe("Generic tests", () => {
104
104
  uri: '//archive.org/download/BookReader/img/page004.jpg' },
105
105
  { width: 800, height: 1200,
106
106
  uri: '//archive.org/download/BookReader/img/page005.jpg' },
107
- ]
107
+ ],
108
108
  ],
109
109
  });
110
110
  br.init();
@@ -23,9 +23,9 @@ const results = {
23
23
  r: 1598,
24
24
  l: 50,
25
25
  page_height: 2940,
26
- page: 37
27
- }]
28
- }]
26
+ page: 37,
27
+ }],
28
+ }],
29
29
  };
30
30
 
31
31
  marshallSearchResults(results, () => '', '{{{', '}}}');
@@ -46,9 +46,9 @@ const resultWithScript = {
46
46
  r: 1598,
47
47
  l: 50,
48
48
  page_height: 2940,
49
- page: 37
50
- }]
51
- }]
49
+ page: 37,
50
+ }],
51
+ }],
52
52
  };
53
53
 
54
54
  marshallSearchResults(resultWithScript, () => '', '{{{', '}}}');
@@ -17,9 +17,9 @@ export const DUMMY_RESULTS = {
17
17
  r: 1598,
18
18
  l: 50,
19
19
  page_height: 2940,
20
- page: 37
21
- }]
22
- }]
20
+ page: 37,
21
+ }],
22
+ }],
23
23
  };
24
24
 
25
25
  marshallSearchResults(DUMMY_RESULTS, () => '', '{{{', '}}}');
@@ -106,7 +106,7 @@ for (const dummyVoice of [dummyVoiceHyphens, dummyVoiceUnderscores]) {
106
106
  { default: false, lang: "ru-RU", name: "Google русский", localService: false, voiceURI: "Google русский" },
107
107
  { default: false, lang: "zh-CN", name: "Google 普通话(中国大陆)", localService: false, voiceURI: "Google 普通话(中国大陆)" },
108
108
  { default: false, lang: "zh-HK", name: "Google 粤語(香港)", localService: false, voiceURI: "Google 粤語(香港)" },
109
- { default: false, lang: "zh-TW", name: "Google 國語(臺灣)", localService: false, voiceURI: "Google 國語(臺灣)" }
109
+ { default: false, lang: "zh-TW", name: "Google 國語(臺灣)", localService: false, voiceURI: "Google 國語(臺灣)" },
110
110
  ];
111
111
 
112
112
  expect(getBestBookVoice(voices, 'en', ['en-CA', 'en'])).toBe(voices[0]);
@@ -39,7 +39,7 @@ describe('WebTTSEngine', () => {
39
39
  localService: true,
40
40
  name: "Daria",
41
41
  voiceURI: "com.apple.voice.compact.bg-BG.Daria",
42
- }
42
+ },
43
43
  ];
44
44
  const voices = WebTTSEngine.prototype.getVoices();
45
45
  expect(voices.length).toBe(3);
@@ -61,7 +61,7 @@ describe('WebTTSEngine', () => {
61
61
  localService: true,
62
62
  name: "Daria",
63
63
  voiceURI: "com.apple.voice.compact.bg-BG.Daria",
64
- }
64
+ },
65
65
  ];
66
66
  const voices = WebTTSEngine.prototype.getVoices();
67
67
  expect(voices.length).toBe(2);
@@ -66,10 +66,10 @@ describe('UrlPlugin tests', () => {
66
66
  const url1 = '/mode/2up?ref=ol&ui=embed&wrapper=false&view=theater';
67
67
 
68
68
  expect(urlPlugin.urlStringToUrlState(url)).toEqual(
69
- {page: 'n7', mode: '2up', q: 'hello', view: 'theather', foo: 'bar', sort: 'title_asc'}
69
+ {page: 'n7', mode: '2up', q: 'hello', view: 'theather', foo: 'bar', sort: 'title_asc'},
70
70
  );
71
71
  expect(urlPlugin.urlStringToUrlState(url1)).toEqual(
72
- {mode: '2up', ref: 'ol', ui: 'embed', wrapper: 'false', view: 'theater'}
72
+ {mode: '2up', ref: 'ol', ui: 'embed', wrapper: 'false', view: 'theater'},
73
73
  );
74
74
  });
75
75
 
@@ -55,7 +55,7 @@ describe('Plugin: URL controller', () => {
55
55
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
56
56
  index: 88,
57
57
  mode: 1,
58
- search: ''
58
+ search: '',
59
59
  }));
60
60
  br.options.urlMode = 'history';
61
61
  br.init();
@@ -71,7 +71,7 @@ describe('Plugin: URL controller', () => {
71
71
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
72
72
  index: 2,
73
73
  mode: 2,
74
- search: ''
74
+ search: '',
75
75
  }));
76
76
  br.options.urlMode = 'history';
77
77
  br.init();
@@ -87,7 +87,7 @@ describe('Plugin: URL controller', () => {
87
87
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
88
88
  index: 1,
89
89
  mode: 2,
90
- search: 'foo'
90
+ search: 'foo',
91
91
  }));
92
92
  BookReader.prototype.search = jest.fn();
93
93
  br.options.urlMode = 'history';
@@ -104,7 +104,7 @@ describe('Plugin: URL controller', () => {
104
104
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
105
105
  index: 1,
106
106
  mode: 2,
107
- view: 'theater'
107
+ view: 'theater',
108
108
  }));
109
109
  BookReader.prototype.search = jest.fn();
110
110
  br.options.urlMode = 'history';
@@ -123,7 +123,7 @@ describe('Plugin: URL controller', () => {
123
123
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
124
124
  index: 1,
125
125
  mode: 2,
126
- view: 'theater'
126
+ view: 'theater',
127
127
  }));
128
128
  BookReader.prototype.search = jest.fn();
129
129
  br.options.urlMode = 'history';
@@ -142,7 +142,7 @@ describe('Plugin: URL controller', () => {
142
142
  BookReader.prototype.paramsFromCurrent = jest.fn(() => ({
143
143
  index: 1,
144
144
  mode: 2,
145
- search: 'foo'
145
+ search: 'foo',
146
146
  }));
147
147
  BookReader.prototype.search = jest.fn();
148
148
  br.options.initialSearchTerm = 'foo';