@internetarchive/collection-browser 1.7.1-alpha.0 → 1.9.0-alpha1

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 (275) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +54 -54
  12. package/dist/src/app-root.js +293 -293
  13. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  14. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  15. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  17. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  18. package/dist/src/assets/img/icons/chevron.js +2 -2
  19. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  20. package/dist/src/assets/img/icons/contract.js +2 -2
  21. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  22. package/dist/src/assets/img/icons/empty-query.js +2 -2
  23. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  24. package/dist/src/assets/img/icons/expand.js +2 -2
  25. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  26. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  27. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  28. package/dist/src/assets/img/icons/eye.js +2 -2
  29. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  30. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  31. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  32. package/dist/src/assets/img/icons/login-required.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  57. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  58. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  59. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  60. package/dist/src/assets/img/icons/null-result.js +2 -2
  61. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  62. package/dist/src/assets/img/icons/restricted.js +2 -2
  63. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  64. package/dist/src/assets/img/icons/reviews.js +2 -2
  65. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  66. package/dist/src/assets/img/icons/upload.js +2 -2
  67. package/dist/src/assets/img/icons/views.d.ts +1 -1
  68. package/dist/src/assets/img/icons/views.js +2 -2
  69. package/dist/src/circular-activity-indicator.d.ts +5 -5
  70. package/dist/src/circular-activity-indicator.js +17 -17
  71. package/dist/src/collection-browser.d.ts +469 -469
  72. package/dist/src/collection-browser.js +1667 -1653
  73. package/dist/src/collection-browser.js.map +1 -1
  74. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  75. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  76. package/dist/src/collection-facets/facets-template.d.ts +20 -20
  77. package/dist/src/collection-facets/facets-template.js +152 -152
  78. package/dist/src/collection-facets/more-facets-content.d.ts +77 -76
  79. package/dist/src/collection-facets/more-facets-content.js +359 -352
  80. package/dist/src/collection-facets/more-facets-content.js.map +1 -1
  81. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  82. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  83. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  84. package/dist/src/collection-facets/toggle-switch.js +94 -94
  85. package/dist/src/collection-facets.d.ts +99 -98
  86. package/dist/src/collection-facets.js +472 -468
  87. package/dist/src/collection-facets.js.map +1 -1
  88. package/dist/src/empty-placeholder.d.ts +21 -21
  89. package/dist/src/empty-placeholder.js +69 -69
  90. package/dist/src/expanded-date-picker.d.ts +43 -43
  91. package/dist/src/expanded-date-picker.js +109 -109
  92. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  93. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  94. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  95. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  96. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  97. package/dist/src/mediatype/mediatype-config.js +85 -85
  98. package/dist/src/models.d.ts +162 -149
  99. package/dist/src/models.js +256 -195
  100. package/dist/src/models.js.map +1 -1
  101. package/dist/src/restoration-state-handler.d.ts +70 -63
  102. package/dist/src/restoration-state-handler.js +355 -326
  103. package/dist/src/restoration-state-handler.js.map +1 -1
  104. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  105. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  106. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  107. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  108. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  109. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  110. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  111. package/dist/src/sort-filter-bar/img/list.js +2 -2
  112. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  113. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  114. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  115. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  116. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  117. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  118. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  119. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  120. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  121. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  122. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +201 -199
  123. package/dist/src/sort-filter-bar/sort-filter-bar.js +622 -617
  124. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  125. package/dist/src/styles/item-image-styles.d.ts +8 -8
  126. package/dist/src/styles/item-image-styles.js +9 -9
  127. package/dist/src/styles/sr-only.d.ts +1 -1
  128. package/dist/src/styles/sr-only.js +2 -2
  129. package/dist/src/tiles/base-tile-component.d.ts +18 -18
  130. package/dist/src/tiles/base-tile-component.js +59 -59
  131. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  132. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  133. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  134. package/dist/src/tiles/grid/account-tile.js +72 -72
  135. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  136. package/dist/src/tiles/grid/collection-tile.js +80 -80
  137. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  138. package/dist/src/tiles/grid/item-tile.js +134 -134
  139. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  140. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  141. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  142. package/dist/src/tiles/grid/tile-stats.js +48 -48
  143. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  144. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  145. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  146. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  147. package/dist/src/tiles/image-block.d.ts +17 -17
  148. package/dist/src/tiles/image-block.js +72 -72
  149. package/dist/src/tiles/item-image.d.ts +35 -35
  150. package/dist/src/tiles/item-image.js +117 -117
  151. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  152. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  153. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  154. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  155. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  156. package/dist/src/tiles/list/tile-list.js +298 -298
  157. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  158. package/dist/src/tiles/mediatype-icon.js +47 -47
  159. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  160. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  161. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  162. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  163. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  164. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  165. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  166. package/dist/src/tiles/text-snippet-block.js +73 -73
  167. package/dist/src/tiles/tile-dispatcher.d.ts +50 -50
  168. package/dist/src/tiles/tile-dispatcher.js +185 -185
  169. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  170. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  171. package/dist/src/utils/analytics-events.d.ts +24 -24
  172. package/dist/src/utils/analytics-events.js +26 -26
  173. package/dist/src/utils/array-equals.d.ts +4 -4
  174. package/dist/src/utils/array-equals.js +10 -10
  175. package/dist/src/utils/format-count.d.ts +7 -7
  176. package/dist/src/utils/format-count.js +76 -76
  177. package/dist/src/utils/format-date.d.ts +2 -2
  178. package/dist/src/utils/format-date.js +25 -25
  179. package/dist/src/utils/format-unit-size.d.ts +2 -2
  180. package/dist/src/utils/format-unit-size.js +33 -33
  181. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  182. package/dist/src/utils/local-date-from-utc.js +15 -15
  183. package/dist/src/utils/sha1.d.ts +2 -2
  184. package/dist/src/utils/sha1.js +8 -8
  185. package/dist/test/collection-browser.test.d.ts +1 -1
  186. package/dist/test/collection-browser.test.js +808 -808
  187. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  188. package/dist/test/collection-facets/facets-template.test.js +134 -134
  189. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  190. package/dist/test/collection-facets/more-facets-content.test.js +139 -114
  191. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -1
  192. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  193. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  194. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  195. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  196. package/dist/test/collection-facets.test.d.ts +2 -2
  197. package/dist/test/collection-facets.test.js +645 -645
  198. package/dist/test/empty-placeholder.test.d.ts +1 -1
  199. package/dist/test/empty-placeholder.test.js +56 -56
  200. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  201. package/dist/test/expanded-date-picker.test.js +95 -95
  202. package/dist/test/icon-overlay.test.d.ts +1 -1
  203. package/dist/test/icon-overlay.test.js +24 -24
  204. package/dist/test/image-block.test.d.ts +1 -1
  205. package/dist/test/image-block.test.js +48 -48
  206. package/dist/test/item-image.test.d.ts +1 -1
  207. package/dist/test/item-image.test.js +84 -84
  208. package/dist/test/mediatype-config.test.d.ts +1 -1
  209. package/dist/test/mediatype-config.test.js +16 -16
  210. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  211. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  212. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  213. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  214. package/dist/test/mocks/mock-search-responses.d.ts +19 -19
  215. package/dist/test/mocks/mock-search-responses.js +623 -623
  216. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  217. package/dist/test/mocks/mock-search-service.js +48 -48
  218. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  219. package/dist/test/restoration-state-handler.test.js +270 -218
  220. package/dist/test/restoration-state-handler.test.js.map +1 -1
  221. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  222. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  223. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  224. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  225. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  226. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +378 -378
  227. package/dist/test/text-overlay.test.d.ts +1 -1
  228. package/dist/test/text-overlay.test.js +48 -48
  229. package/dist/test/text-snippet-block.test.d.ts +1 -1
  230. package/dist/test/text-snippet-block.test.js +57 -57
  231. package/dist/test/tile-stats.test.d.ts +1 -1
  232. package/dist/test/tile-stats.test.js +33 -33
  233. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  234. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  235. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  236. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  237. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  238. package/dist/test/tiles/grid/item-tile.test.js +254 -254
  239. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  240. package/dist/test/tiles/hover/hover-pane-controller.test.js +257 -257
  241. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  242. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  243. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  244. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  245. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  246. package/dist/test/tiles/list/tile-list.test.js +242 -242
  247. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  248. package/dist/test/tiles/tile-dispatcher.test.js +67 -67
  249. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  250. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  251. package/dist/test/utils/array-equals.test.d.ts +1 -1
  252. package/dist/test/utils/array-equals.test.js +26 -26
  253. package/dist/test/utils/format-count.test.d.ts +1 -1
  254. package/dist/test/utils/format-count.test.js +23 -23
  255. package/dist/test/utils/format-date.test.d.ts +1 -1
  256. package/dist/test/utils/format-date.test.js +17 -17
  257. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  258. package/dist/test/utils/format-unit-size.test.js +17 -17
  259. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  260. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  261. package/local.archive.org.cert +86 -86
  262. package/local.archive.org.key +27 -27
  263. package/package.json +3 -3
  264. package/renovate.json +6 -6
  265. package/src/collection-browser.ts +25 -8
  266. package/src/collection-facets/more-facets-content.ts +9 -2
  267. package/src/collection-facets.ts +3 -0
  268. package/src/models.ts +193 -109
  269. package/src/restoration-state-handler.ts +66 -40
  270. package/src/sort-filter-bar/sort-filter-bar.ts +34 -27
  271. package/test/collection-facets/more-facets-content.test.ts +35 -0
  272. package/test/restoration-state-handler.test.ts +68 -1
  273. package/tsconfig.json +21 -21
  274. package/web-dev-server.config.mjs +30 -30
  275. package/web-test-runner.config.mjs +41 -41
@@ -1,15 +1,15 @@
1
- import type { Result } from '@internetarchive/result-type';
2
- import type { SearchParams, SearchResponse, SearchServiceInterface, SearchServiceError, SearchType } from '@internetarchive/search-service';
3
- export declare class MockSearchService implements SearchServiceInterface {
4
- searchParams?: SearchParams;
5
- searchType?: SearchType;
6
- asyncResponse: boolean;
7
- asyncResponseDelay: number;
8
- resultsSpy: Function;
9
- constructor({ asyncResponse, asyncResponseDelay, resultsSpy, }?: {
10
- asyncResponse?: boolean | undefined;
11
- asyncResponseDelay?: number | undefined;
12
- resultsSpy?: (() => void) | undefined;
13
- });
14
- search(params: SearchParams, searchType: SearchType): Promise<Result<SearchResponse, SearchServiceError>>;
15
- }
1
+ import type { Result } from '@internetarchive/result-type';
2
+ import type { SearchParams, SearchResponse, SearchServiceInterface, SearchServiceError, SearchType } from '@internetarchive/search-service';
3
+ export declare class MockSearchService implements SearchServiceInterface {
4
+ searchParams?: SearchParams;
5
+ searchType?: SearchType;
6
+ asyncResponse: boolean;
7
+ asyncResponseDelay: number;
8
+ resultsSpy: Function;
9
+ constructor({ asyncResponse, asyncResponseDelay, resultsSpy, }?: {
10
+ asyncResponse?: boolean | undefined;
11
+ asyncResponseDelay?: number | undefined;
12
+ resultsSpy?: (() => void) | undefined;
13
+ });
14
+ search(params: SearchParams, searchType: SearchType): Promise<Result<SearchResponse, SearchServiceError>>;
15
+ }
@@ -1,49 +1,49 @@
1
- import { getMockSuccessSingleResult, getMockSuccessMultipleResults, getMockSuccessSingleResultWithSort, getMockSuccessLoggedInResult, getMockSuccessNoPreviewResult, getMockSuccessLoggedInAndNoPreviewResult, getMockSuccessWithYearHistogramAggs, getMockSuccessMultiLineDescription, getMockSuccessFirstTitleResult, getMockSuccessFirstCreatorResult, getMockErrorResult, getMockMalformedResult, getMockSuccessWithCollectionTitles, getMockSuccessWithCollectionAggregations, getMockSuccessExtraQuotedHref, getMockSuccessWithDefaultSort, getMockSuccessWithConciseDefaultSort, } from './mock-search-responses';
2
- const responses = {
3
- 'single-result': getMockSuccessSingleResult,
4
- years: getMockSuccessWithYearHistogramAggs,
5
- 'multi-line-description': getMockSuccessMultiLineDescription,
6
- loggedin: getMockSuccessLoggedInResult,
7
- 'no-preview': getMockSuccessNoPreviewResult,
8
- 'loggedin-no-preview': getMockSuccessLoggedInAndNoPreviewResult,
9
- 'first-title': getMockSuccessFirstTitleResult,
10
- 'first-creator': getMockSuccessFirstCreatorResult,
11
- 'collection-titles': getMockSuccessWithCollectionTitles,
12
- 'collection-aggregations': getMockSuccessWithCollectionAggregations,
13
- 'extra-quoted-href': getMockSuccessExtraQuotedHref,
14
- 'default-sort': getMockSuccessWithDefaultSort,
15
- 'default-sort-concise': getMockSuccessWithConciseDefaultSort,
16
- error: getMockErrorResult,
17
- malformed: getMockMalformedResult,
18
- };
19
- export class MockSearchService {
20
- constructor({ asyncResponse = false, asyncResponseDelay = 0, resultsSpy = () => { }, } = {}) {
21
- this.asyncResponse = asyncResponse;
22
- this.asyncResponseDelay = asyncResponseDelay;
23
- this.resultsSpy = resultsSpy;
24
- }
25
- async search(params, searchType) {
26
- var _a, _b;
27
- this.searchParams = params;
28
- this.searchType = searchType;
29
- if (this.asyncResponse) {
30
- // Add an artificial 1-tick delay
31
- await new Promise(res => {
32
- setTimeout(res, this.asyncResponseDelay);
33
- });
34
- }
35
- const responseKey = (_a = (this.searchParams.query || this.searchParams.pageTarget)) !== null && _a !== void 0 ? _a : '';
36
- const resultFn = (_b = responses[responseKey]) !== null && _b !== void 0 ? _b : getMockSuccessMultipleResults;
37
- let result = resultFn();
38
- // with-sort query has special handling
39
- if (this.searchParams.query === 'with-sort') {
40
- result = getMockSuccessSingleResultWithSort(this.resultsSpy);
41
- }
42
- // Apply any uid param from the request
43
- if (result.success) {
44
- result.success.request.clientParameters.uid = params.uid;
45
- }
46
- return result;
47
- }
48
- }
1
+ import { getMockSuccessSingleResult, getMockSuccessMultipleResults, getMockSuccessSingleResultWithSort, getMockSuccessLoggedInResult, getMockSuccessNoPreviewResult, getMockSuccessLoggedInAndNoPreviewResult, getMockSuccessWithYearHistogramAggs, getMockSuccessMultiLineDescription, getMockSuccessFirstTitleResult, getMockSuccessFirstCreatorResult, getMockErrorResult, getMockMalformedResult, getMockSuccessWithCollectionTitles, getMockSuccessWithCollectionAggregations, getMockSuccessExtraQuotedHref, getMockSuccessWithDefaultSort, getMockSuccessWithConciseDefaultSort, } from './mock-search-responses';
2
+ const responses = {
3
+ 'single-result': getMockSuccessSingleResult,
4
+ years: getMockSuccessWithYearHistogramAggs,
5
+ 'multi-line-description': getMockSuccessMultiLineDescription,
6
+ loggedin: getMockSuccessLoggedInResult,
7
+ 'no-preview': getMockSuccessNoPreviewResult,
8
+ 'loggedin-no-preview': getMockSuccessLoggedInAndNoPreviewResult,
9
+ 'first-title': getMockSuccessFirstTitleResult,
10
+ 'first-creator': getMockSuccessFirstCreatorResult,
11
+ 'collection-titles': getMockSuccessWithCollectionTitles,
12
+ 'collection-aggregations': getMockSuccessWithCollectionAggregations,
13
+ 'extra-quoted-href': getMockSuccessExtraQuotedHref,
14
+ 'default-sort': getMockSuccessWithDefaultSort,
15
+ 'default-sort-concise': getMockSuccessWithConciseDefaultSort,
16
+ error: getMockErrorResult,
17
+ malformed: getMockMalformedResult,
18
+ };
19
+ export class MockSearchService {
20
+ constructor({ asyncResponse = false, asyncResponseDelay = 0, resultsSpy = () => { }, } = {}) {
21
+ this.asyncResponse = asyncResponse;
22
+ this.asyncResponseDelay = asyncResponseDelay;
23
+ this.resultsSpy = resultsSpy;
24
+ }
25
+ async search(params, searchType) {
26
+ var _a, _b;
27
+ this.searchParams = params;
28
+ this.searchType = searchType;
29
+ if (this.asyncResponse) {
30
+ // Add an artificial 1-tick delay
31
+ await new Promise(res => {
32
+ setTimeout(res, this.asyncResponseDelay);
33
+ });
34
+ }
35
+ const responseKey = (_a = (this.searchParams.query || this.searchParams.pageTarget)) !== null && _a !== void 0 ? _a : '';
36
+ const resultFn = (_b = responses[responseKey]) !== null && _b !== void 0 ? _b : getMockSuccessMultipleResults;
37
+ let result = resultFn();
38
+ // with-sort query has special handling
39
+ if (this.searchParams.query === 'with-sort') {
40
+ result = getMockSuccessSingleResultWithSort(this.resultsSpy);
41
+ }
42
+ // Apply any uid param from the request
43
+ if (result.success) {
44
+ result.success.request.clientParameters.uid = params.uid;
45
+ }
46
+ return result;
47
+ }
48
+ }
49
49
  //# sourceMappingURL=mock-search-service.js.map
@@ -1 +1 @@
1
- export {};
1
+ export {};
@@ -1,219 +1,271 @@
1
- import { SearchType } from '@internetarchive/search-service';
2
- import { expect } from '@open-wc/testing';
3
- import { getDefaultSelectedFacets } from '../src/models';
4
- import { RestorationStateHandler } from '../src/restoration-state-handler';
5
- describe('Restoration state handler', () => {
6
- it('should restore query from URL', async () => {
7
- const handler = new RestorationStateHandler({ context: 'search' });
8
- const url = new URL(window.location.href);
9
- url.search = '?query=boop';
10
- window.history.replaceState({ path: url.href }, '', url.href);
11
- const restorationState = handler.getRestorationState();
12
- expect(restorationState.baseQuery).to.equal('boop');
13
- });
14
- it('should restore metadata search type from URL without valid sin', async () => {
15
- const handler = new RestorationStateHandler({ context: 'search' });
16
- const url = new URL(window.location.href);
17
- url.search = '?sin=foo';
18
- window.history.replaceState({ path: url.href }, '', url.href);
19
- const restorationState = handler.getRestorationState();
20
- expect(restorationState.searchType).to.equal(SearchType.METADATA);
21
- });
22
- it('should restore metadata search type if sin explicitly empty in URL', async () => {
23
- const handler = new RestorationStateHandler({ context: 'search' });
24
- const url = new URL(window.location.href);
25
- url.search = '?sin=';
26
- window.history.replaceState({ path: url.href }, '', url.href);
27
- const restorationState = handler.getRestorationState();
28
- expect(restorationState.searchType).to.equal(SearchType.METADATA);
29
- });
30
- it('should restore full text search type from URL', async () => {
31
- const handler = new RestorationStateHandler({ context: 'search' });
32
- const url = new URL(window.location.href);
33
- url.search = '?sin=TXT';
34
- window.history.replaceState({ path: url.href }, '', url.href);
35
- const restorationState = handler.getRestorationState();
36
- expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);
37
- });
38
- it('should restore page number from URL', async () => {
39
- const handler = new RestorationStateHandler({ context: 'search' });
40
- const url = new URL(window.location.href);
41
- url.search = '?page=42';
42
- window.history.replaceState({ path: url.href }, '', url.href);
43
- const restorationState = handler.getRestorationState();
44
- expect(restorationState.currentPage).to.equal(42);
45
- });
46
- it('should restore selected year facets from URL', async () => {
47
- const handler = new RestorationStateHandler({ context: 'search' });
48
- const url = new URL(window.location.href);
49
- url.search = '?and[]=year:"2018"';
50
- window.history.replaceState({ path: url.href }, '', url.href);
51
- const restorationState = handler.getRestorationState();
52
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('selected');
53
- });
54
- it('should ignore unrecognized facet types in URL', async () => {
55
- const handler = new RestorationStateHandler({ context: 'search' });
56
- const url = new URL(window.location.href);
57
- url.search = '?and[]=foo:"bar"';
58
- window.history.replaceState({ path: url.href }, '', url.href);
59
- const restorationState = handler.getRestorationState();
60
- expect(restorationState.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
61
- });
62
- it('should restore selected date range facets from URL', async () => {
63
- const handler = new RestorationStateHandler({ context: 'search' });
64
- const url = new URL(window.location.href);
65
- url.search = '?and[]=year:"2018+TO+2021"';
66
- window.history.replaceState({ path: url.href }, '', url.href);
67
- const restorationState = handler.getRestorationState();
68
- expect(restorationState.minSelectedDate).to.equal('2018');
69
- expect(restorationState.maxSelectedDate).to.equal('2021');
70
- });
71
- it('should restore creator filter from URL', async () => {
72
- const handler = new RestorationStateHandler({ context: 'search' });
73
- const url = new URL(window.location.href);
74
- url.search = '?and[]=firstCreator:F';
75
- window.history.replaceState({ path: url.href }, '', url.href);
76
- const restorationState = handler.getRestorationState();
77
- expect(restorationState.selectedCreatorFilter).to.equal('F');
78
- });
79
- it('should restore title filter from URL', async () => {
80
- const handler = new RestorationStateHandler({ context: 'search' });
81
- const url = new URL(window.location.href);
82
- url.search = '?and[]=firstTitle:F';
83
- window.history.replaceState({ path: url.href }, '', url.href);
84
- const restorationState = handler.getRestorationState();
85
- expect(restorationState.selectedTitleFilter).to.equal('F');
86
- });
87
- it('should restore other selected facets from URL', async () => {
88
- const handler = new RestorationStateHandler({ context: 'search' });
89
- const url = new URL(window.location.href);
90
- url.search = '?and[]=subject:"foo"';
91
- window.history.replaceState({ path: url.href }, '', url.href);
92
- const restorationState = handler.getRestorationState();
93
- expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
94
- });
95
- it('should restore negative facets from URL', async () => {
96
- const handler = new RestorationStateHandler({ context: 'search' });
97
- const url = new URL(window.location.href);
98
- url.search = '?not[]=year:2018';
99
- window.history.replaceState({ path: url.href }, '', url.href);
100
- const restorationState = handler.getRestorationState();
101
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
102
- });
103
- it('should restore multiple selected/negative facets from URL', async () => {
104
- const handler = new RestorationStateHandler({ context: 'search' });
105
- const url = new URL(window.location.href);
106
- url.search =
107
- '?and[]=collection:"foo"&and[]=collection:"bar"&not[]=collection:"baz"&not[]=collection:"boop"';
108
- window.history.replaceState({ path: url.href }, '', url.href);
109
- const restorationState = handler.getRestorationState();
110
- expect(restorationState.selectedFacets.collection.foo.state).to.equal('selected');
111
- expect(restorationState.selectedFacets.collection.bar.state).to.equal('selected');
112
- expect(restorationState.selectedFacets.collection.baz.state).to.equal('hidden');
113
- expect(restorationState.selectedFacets.collection.boop.state).to.equal('hidden');
114
- });
115
- it('negative facets take precedence if both present in URL', async () => {
116
- const handler = new RestorationStateHandler({ context: 'search' });
117
- const url = new URL(window.location.href);
118
- url.search = '?and[]=collection:"foo"&not[]=collection:"foo"';
119
- window.history.replaceState({ path: url.href }, '', url.href);
120
- const restorationState = handler.getRestorationState();
121
- expect(restorationState.selectedFacets.collection.foo.state).to.equal('hidden');
122
- });
123
- it('should restore selected facets with numbers in the square brackets', async () => {
124
- const handler = new RestorationStateHandler({ context: 'search' });
125
- const url = new URL(window.location.href);
126
- url.search = '?and[12]=subject:"foo"';
127
- window.history.replaceState({ path: url.href }, '', url.href);
128
- const restorationState = handler.getRestorationState();
129
- expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
130
- });
131
- it('should restore negative facets with numbers in the square brackets', async () => {
132
- const handler = new RestorationStateHandler({ context: 'search' });
133
- const url = new URL(window.location.href);
134
- url.search = '?not[12]=year:2018';
135
- window.history.replaceState({ path: url.href }, '', url.href);
136
- const restorationState = handler.getRestorationState();
137
- expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
138
- });
139
- it('should restore sort from URL (space format)', async () => {
140
- const handler = new RestorationStateHandler({ context: 'search' });
141
- const url = new URL(window.location.href);
142
- url.search = '?sort=date+desc';
143
- window.history.replaceState({ path: url.href }, '', url.href);
144
- const restorationState = handler.getRestorationState();
145
- expect(restorationState.selectedSort).to.equal('date');
146
- expect(restorationState.sortDirection).to.equal('desc');
147
- });
148
- it('should restore sort from URL (prefix format, desc)', async () => {
149
- const handler = new RestorationStateHandler({ context: 'search' });
150
- const url = new URL(window.location.href);
151
- url.search = '?sort=-date';
152
- window.history.replaceState({ path: url.href }, '', url.href);
153
- const restorationState = handler.getRestorationState();
154
- expect(restorationState.selectedSort).to.equal('date');
155
- expect(restorationState.sortDirection).to.equal('desc');
156
- });
157
- it('should restore sort from URL (prefix format, asc)', async () => {
158
- const handler = new RestorationStateHandler({ context: 'search' });
159
- const url = new URL(window.location.href);
160
- url.search = '?sort=date';
161
- window.history.replaceState({ path: url.href }, '', url.href);
162
- const restorationState = handler.getRestorationState();
163
- expect(restorationState.selectedSort).to.equal('date');
164
- expect(restorationState.sortDirection).to.equal('asc');
165
- });
166
- it('should not save current page state to the URL for page 1', async () => {
167
- const url = new URL(window.location.href);
168
- url.search = '';
169
- window.history.replaceState({ path: url.href }, '', url.href);
170
- const handler = new RestorationStateHandler({ context: 'search' });
171
- handler.persistState({
172
- currentPage: 1,
173
- selectedFacets: getDefaultSelectedFacets(),
174
- });
175
- expect(window.location.search).to.be.empty;
176
- });
177
- it('should save current page state to the URL when page > 1', async () => {
178
- const url = new URL(window.location.href);
179
- url.search = '';
180
- window.history.replaceState({ path: url.href }, '', url.href);
181
- const handler = new RestorationStateHandler({ context: 'search' });
182
- handler.persistState({
183
- currentPage: 2,
184
- selectedFacets: getDefaultSelectedFacets(),
185
- });
186
- expect(window.location.search).to.equal('?page=2');
187
- });
188
- it('should upgrade legacy search params to new ones', async () => {
189
- const url = new URL(window.location.href);
190
- url.search = '?q=foo';
191
- window.history.replaceState({ path: url.href }, '', url.href);
192
- const handler = new RestorationStateHandler({ context: 'search' });
193
- const restorationState = handler.getRestorationState();
194
- expect(restorationState.baseQuery).to.equal('foo');
195
- handler.persistState(restorationState);
196
- expect(window.location.search).to.equal('?query=foo');
197
- });
198
- it('should remove empty sin param', async () => {
199
- const url = new URL(window.location.href);
200
- url.search = '?sin=';
201
- window.history.replaceState({ path: url.href }, '', url.href);
202
- const handler = new RestorationStateHandler({ context: 'search' });
203
- handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
204
- expect(window.location.search).to.equal('');
205
- });
206
- it('round trip load/persist should erase numbers in square brackets', async () => {
207
- const handler = new RestorationStateHandler({ context: 'search' });
208
- const url = new URL(window.location.href);
209
- url.search = '?and[0]=subject:"foo"';
210
- window.history.replaceState({ path: url.href }, '', url.href);
211
- // Load state from the URL and immediately persist it back to the URL
212
- const restorationState = handler.getRestorationState();
213
- handler.persistState(restorationState);
214
- // Ensure the new URL includes the "normalized" facet parameter and not the numbered one
215
- expect(decodeURIComponent(window.location.search)).to.include('and[]=subject:"foo"');
216
- expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;
217
- });
218
- });
1
+ import { SearchType } from '@internetarchive/search-service';
2
+ import { expect } from '@open-wc/testing';
3
+ import { SortField, getDefaultSelectedFacets } from '../src/models';
4
+ import { RestorationStateHandler } from '../src/restoration-state-handler';
5
+ describe('Restoration state handler', () => {
6
+ it('should restore query from URL', async () => {
7
+ const handler = new RestorationStateHandler({ context: 'search' });
8
+ const url = new URL(window.location.href);
9
+ url.search = '?query=boop';
10
+ window.history.replaceState({ path: url.href }, '', url.href);
11
+ const restorationState = handler.getRestorationState();
12
+ expect(restorationState.baseQuery).to.equal('boop');
13
+ });
14
+ it('should restore metadata search type from URL without valid sin', async () => {
15
+ const handler = new RestorationStateHandler({ context: 'search' });
16
+ const url = new URL(window.location.href);
17
+ url.search = '?sin=foo';
18
+ window.history.replaceState({ path: url.href }, '', url.href);
19
+ const restorationState = handler.getRestorationState();
20
+ expect(restorationState.searchType).to.equal(SearchType.METADATA);
21
+ });
22
+ it('should restore metadata search type if sin explicitly empty in URL', async () => {
23
+ const handler = new RestorationStateHandler({ context: 'search' });
24
+ const url = new URL(window.location.href);
25
+ url.search = '?sin=';
26
+ window.history.replaceState({ path: url.href }, '', url.href);
27
+ const restorationState = handler.getRestorationState();
28
+ expect(restorationState.searchType).to.equal(SearchType.METADATA);
29
+ });
30
+ it('should restore full text search type from URL', async () => {
31
+ const handler = new RestorationStateHandler({ context: 'search' });
32
+ const url = new URL(window.location.href);
33
+ url.search = '?sin=TXT';
34
+ window.history.replaceState({ path: url.href }, '', url.href);
35
+ const restorationState = handler.getRestorationState();
36
+ expect(restorationState.searchType).to.equal(SearchType.FULLTEXT);
37
+ });
38
+ it('should restore page number from URL', async () => {
39
+ const handler = new RestorationStateHandler({ context: 'search' });
40
+ const url = new URL(window.location.href);
41
+ url.search = '?page=42';
42
+ window.history.replaceState({ path: url.href }, '', url.href);
43
+ const restorationState = handler.getRestorationState();
44
+ expect(restorationState.currentPage).to.equal(42);
45
+ });
46
+ it('should restore selected year facets from URL', async () => {
47
+ const handler = new RestorationStateHandler({ context: 'search' });
48
+ const url = new URL(window.location.href);
49
+ url.search = '?and[]=year:"2018"';
50
+ window.history.replaceState({ path: url.href }, '', url.href);
51
+ const restorationState = handler.getRestorationState();
52
+ expect(restorationState.selectedFacets.year['2018'].state).to.equal('selected');
53
+ });
54
+ it('should ignore unrecognized facet types in URL', async () => {
55
+ const handler = new RestorationStateHandler({ context: 'search' });
56
+ const url = new URL(window.location.href);
57
+ url.search = '?and[]=foo:"bar"';
58
+ window.history.replaceState({ path: url.href }, '', url.href);
59
+ const restorationState = handler.getRestorationState();
60
+ expect(restorationState.selectedFacets).to.deep.equal(getDefaultSelectedFacets());
61
+ });
62
+ it('should restore selected date range facets from URL', async () => {
63
+ const handler = new RestorationStateHandler({ context: 'search' });
64
+ const url = new URL(window.location.href);
65
+ url.search = '?and[]=year:"2018+TO+2021"';
66
+ window.history.replaceState({ path: url.href }, '', url.href);
67
+ const restorationState = handler.getRestorationState();
68
+ expect(restorationState.minSelectedDate).to.equal('2018');
69
+ expect(restorationState.maxSelectedDate).to.equal('2021');
70
+ });
71
+ it('should restore creator filter from URL', async () => {
72
+ const handler = new RestorationStateHandler({ context: 'search' });
73
+ const url = new URL(window.location.href);
74
+ url.search = '?and[]=firstCreator:F';
75
+ window.history.replaceState({ path: url.href }, '', url.href);
76
+ const restorationState = handler.getRestorationState();
77
+ expect(restorationState.selectedCreatorFilter).to.equal('F');
78
+ });
79
+ it('should restore title filter from URL', async () => {
80
+ const handler = new RestorationStateHandler({ context: 'search' });
81
+ const url = new URL(window.location.href);
82
+ url.search = '?and[]=firstTitle:F';
83
+ window.history.replaceState({ path: url.href }, '', url.href);
84
+ const restorationState = handler.getRestorationState();
85
+ expect(restorationState.selectedTitleFilter).to.equal('F');
86
+ });
87
+ it('should restore other selected facets from URL', async () => {
88
+ const handler = new RestorationStateHandler({ context: 'search' });
89
+ const url = new URL(window.location.href);
90
+ url.search = '?and[]=subject:"foo"';
91
+ window.history.replaceState({ path: url.href }, '', url.href);
92
+ const restorationState = handler.getRestorationState();
93
+ expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
94
+ });
95
+ it('should restore negative facets from URL', async () => {
96
+ const handler = new RestorationStateHandler({ context: 'search' });
97
+ const url = new URL(window.location.href);
98
+ url.search = '?not[]=year:2018';
99
+ window.history.replaceState({ path: url.href }, '', url.href);
100
+ const restorationState = handler.getRestorationState();
101
+ expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
102
+ });
103
+ it('should restore multiple selected/negative facets from URL', async () => {
104
+ const handler = new RestorationStateHandler({ context: 'search' });
105
+ const url = new URL(window.location.href);
106
+ url.search =
107
+ '?and[]=collection:"foo"&and[]=collection:"bar"&not[]=collection:"baz"&not[]=collection:"boop"';
108
+ window.history.replaceState({ path: url.href }, '', url.href);
109
+ const restorationState = handler.getRestorationState();
110
+ expect(restorationState.selectedFacets.collection.foo.state).to.equal('selected');
111
+ expect(restorationState.selectedFacets.collection.bar.state).to.equal('selected');
112
+ expect(restorationState.selectedFacets.collection.baz.state).to.equal('hidden');
113
+ expect(restorationState.selectedFacets.collection.boop.state).to.equal('hidden');
114
+ });
115
+ it('negative facets take precedence if both present in URL', async () => {
116
+ const handler = new RestorationStateHandler({ context: 'search' });
117
+ const url = new URL(window.location.href);
118
+ url.search = '?and[]=collection:"foo"&not[]=collection:"foo"';
119
+ window.history.replaceState({ path: url.href }, '', url.href);
120
+ const restorationState = handler.getRestorationState();
121
+ expect(restorationState.selectedFacets.collection.foo.state).to.equal('hidden');
122
+ });
123
+ it('should restore selected facets with numbers in the square brackets', async () => {
124
+ const handler = new RestorationStateHandler({ context: 'search' });
125
+ const url = new URL(window.location.href);
126
+ url.search = '?and[12]=subject:"foo"';
127
+ window.history.replaceState({ path: url.href }, '', url.href);
128
+ const restorationState = handler.getRestorationState();
129
+ expect(restorationState.selectedFacets.subject.foo.state).to.equal('selected');
130
+ });
131
+ it('should restore negative facets with numbers in the square brackets', async () => {
132
+ const handler = new RestorationStateHandler({ context: 'search' });
133
+ const url = new URL(window.location.href);
134
+ url.search = '?not[12]=year:2018';
135
+ window.history.replaceState({ path: url.href }, '', url.href);
136
+ const restorationState = handler.getRestorationState();
137
+ expect(restorationState.selectedFacets.year['2018'].state).to.equal('hidden');
138
+ });
139
+ it('should restore sort from URL (space format)', async () => {
140
+ const handler = new RestorationStateHandler({ context: 'search' });
141
+ const url = new URL(window.location.href);
142
+ url.search = '?sort=date+desc';
143
+ window.history.replaceState({ path: url.href }, '', url.href);
144
+ const restorationState = handler.getRestorationState();
145
+ expect(restorationState.selectedSort).to.equal('date');
146
+ expect(restorationState.sortDirection).to.equal('desc');
147
+ });
148
+ it('should restore sort from URL (prefix format, desc)', async () => {
149
+ const handler = new RestorationStateHandler({ context: 'search' });
150
+ const url = new URL(window.location.href);
151
+ url.search = '?sort=-date';
152
+ window.history.replaceState({ path: url.href }, '', url.href);
153
+ const restorationState = handler.getRestorationState();
154
+ expect(restorationState.selectedSort).to.equal('date');
155
+ expect(restorationState.sortDirection).to.equal('desc');
156
+ });
157
+ it('should restore sort from URL (prefix format, asc)', async () => {
158
+ const handler = new RestorationStateHandler({ context: 'search' });
159
+ const url = new URL(window.location.href);
160
+ url.search = '?sort=date';
161
+ window.history.replaceState({ path: url.href }, '', url.href);
162
+ const restorationState = handler.getRestorationState();
163
+ expect(restorationState.selectedSort).to.equal('date');
164
+ expect(restorationState.sortDirection).to.equal('asc');
165
+ });
166
+ it('should restore sort from URL (space format)', async () => {
167
+ const handler = new RestorationStateHandler({ context: 'search' });
168
+ const url = new URL(window.location.href);
169
+ url.search = '?sort=foo+desc';
170
+ window.history.replaceState({ path: url.href }, '', url.href);
171
+ const restorationState = handler.getRestorationState();
172
+ expect(restorationState.selectedSort).to.equal('unrecognized');
173
+ expect(restorationState.sortDirection).to.equal('desc');
174
+ });
175
+ it('should restore unrecognized sort from URL (prefix format)', async () => {
176
+ const handler = new RestorationStateHandler({ context: 'search' });
177
+ const url = new URL(window.location.href);
178
+ url.search = '?sort=-foo';
179
+ window.history.replaceState({ path: url.href }, '', url.href);
180
+ const restorationState = handler.getRestorationState();
181
+ expect(restorationState.selectedSort).to.equal('unrecognized');
182
+ expect(restorationState.sortDirection).to.equal('desc');
183
+ });
184
+ it('should save direction to URL even for unrecognized sort fields', async () => {
185
+ const url = new URL(window.location.href);
186
+ url.search = '?sort=foo';
187
+ window.history.replaceState({ path: url.href }, '', url.href);
188
+ const handler = new RestorationStateHandler({ context: 'search' });
189
+ handler.persistState({
190
+ selectedSort: SortField.unrecognized,
191
+ sortDirection: 'desc',
192
+ selectedFacets: getDefaultSelectedFacets(),
193
+ });
194
+ expect(window.location.search).to.equal('?sort=-foo');
195
+ });
196
+ it('should keep existing direction for unrecognized sort fields when unspecified in state', async () => {
197
+ const url = new URL(window.location.href);
198
+ url.search = '?sort=foo+desc';
199
+ window.history.replaceState({ path: url.href }, '', url.href);
200
+ const handler = new RestorationStateHandler({ context: 'search' });
201
+ handler.persistState({
202
+ selectedSort: SortField.unrecognized,
203
+ selectedFacets: getDefaultSelectedFacets(),
204
+ });
205
+ expect(window.location.search).to.equal('?sort=-foo');
206
+ });
207
+ it('should just ignore unrecognized sort fields w/ unknown formats', async () => {
208
+ const url = new URL(window.location.href);
209
+ url.search = '?sort=+foo';
210
+ window.history.replaceState({ path: url.href }, '', url.href);
211
+ const handler = new RestorationStateHandler({ context: 'search' });
212
+ handler.persistState({
213
+ selectedSort: SortField.unrecognized,
214
+ selectedFacets: getDefaultSelectedFacets(),
215
+ });
216
+ expect(window.location.search).to.equal('?sort=+foo');
217
+ });
218
+ it('should not save current page state to the URL for page 1', async () => {
219
+ const url = new URL(window.location.href);
220
+ url.search = '';
221
+ window.history.replaceState({ path: url.href }, '', url.href);
222
+ const handler = new RestorationStateHandler({ context: 'search' });
223
+ handler.persistState({
224
+ currentPage: 1,
225
+ selectedFacets: getDefaultSelectedFacets(),
226
+ });
227
+ expect(window.location.search).to.be.empty;
228
+ });
229
+ it('should save current page state to the URL when page > 1', async () => {
230
+ const url = new URL(window.location.href);
231
+ url.search = '';
232
+ window.history.replaceState({ path: url.href }, '', url.href);
233
+ const handler = new RestorationStateHandler({ context: 'search' });
234
+ handler.persistState({
235
+ currentPage: 2,
236
+ selectedFacets: getDefaultSelectedFacets(),
237
+ });
238
+ expect(window.location.search).to.equal('?page=2');
239
+ });
240
+ it('should upgrade legacy search params to new ones', async () => {
241
+ const url = new URL(window.location.href);
242
+ url.search = '?q=foo';
243
+ window.history.replaceState({ path: url.href }, '', url.href);
244
+ const handler = new RestorationStateHandler({ context: 'search' });
245
+ const restorationState = handler.getRestorationState();
246
+ expect(restorationState.baseQuery).to.equal('foo');
247
+ handler.persistState(restorationState);
248
+ expect(window.location.search).to.equal('?query=foo');
249
+ });
250
+ it('should remove empty sin param', async () => {
251
+ const url = new URL(window.location.href);
252
+ url.search = '?sin=';
253
+ window.history.replaceState({ path: url.href }, '', url.href);
254
+ const handler = new RestorationStateHandler({ context: 'search' });
255
+ handler.persistState({ selectedFacets: getDefaultSelectedFacets() });
256
+ expect(window.location.search).to.equal('');
257
+ });
258
+ it('round trip load/persist should erase numbers in square brackets', async () => {
259
+ const handler = new RestorationStateHandler({ context: 'search' });
260
+ const url = new URL(window.location.href);
261
+ url.search = '?and[0]=subject:"foo"';
262
+ window.history.replaceState({ path: url.href }, '', url.href);
263
+ // Load state from the URL and immediately persist it back to the URL
264
+ const restorationState = handler.getRestorationState();
265
+ handler.persistState(restorationState);
266
+ // Ensure the new URL includes the "normalized" facet parameter and not the numbered one
267
+ expect(decodeURIComponent(window.location.search)).to.include('and[]=subject:"foo"');
268
+ expect(new URL(window.location.href).searchParams.get('and[0]')).to.be.null;
269
+ });
270
+ });
219
271
  //# sourceMappingURL=restoration-state-handler.test.js.map