@internetarchive/collection-browser 1.11.1-alpha.3 → 1.13.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 +472 -471
  72. package/dist/src/collection-browser.js +1695 -1680
  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 -77
  79. package/dist/src/collection-facets/more-facets-content.js +359 -359
  80. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  81. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  82. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  83. package/dist/src/collection-facets/toggle-switch.js +94 -94
  84. package/dist/src/collection-facets.d.ts +103 -99
  85. package/dist/src/collection-facets.js +536 -471
  86. package/dist/src/collection-facets.js.map +1 -1
  87. package/dist/src/empty-placeholder.d.ts +23 -23
  88. package/dist/src/empty-placeholder.js +74 -74
  89. package/dist/src/expanded-date-picker.d.ts +43 -43
  90. package/dist/src/expanded-date-picker.js +109 -109
  91. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  92. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  93. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  94. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  95. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  96. package/dist/src/mediatype/mediatype-config.js +85 -85
  97. package/dist/src/models.d.ts +163 -163
  98. package/dist/src/models.js +269 -269
  99. package/dist/src/restoration-state-handler.d.ts +70 -70
  100. package/dist/src/restoration-state-handler.js +355 -355
  101. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  102. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  103. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  104. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  105. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  106. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  107. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  108. package/dist/src/sort-filter-bar/img/list.js +2 -2
  109. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  110. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  111. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  112. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  113. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  114. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  115. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  116. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  117. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  118. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  119. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +208 -208
  120. package/dist/src/sort-filter-bar/sort-filter-bar.js +637 -637
  121. package/dist/src/styles/item-image-styles.d.ts +8 -8
  122. package/dist/src/styles/item-image-styles.js +9 -9
  123. package/dist/src/styles/sr-only.d.ts +1 -1
  124. package/dist/src/styles/sr-only.js +2 -2
  125. package/dist/src/tiles/base-tile-component.d.ts +18 -18
  126. package/dist/src/tiles/base-tile-component.js +59 -59
  127. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  128. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  129. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  130. package/dist/src/tiles/grid/account-tile.js +72 -72
  131. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  132. package/dist/src/tiles/grid/collection-tile.js +80 -80
  133. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  134. package/dist/src/tiles/grid/item-tile.js +134 -134
  135. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  136. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  137. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  138. package/dist/src/tiles/grid/tile-stats.js +48 -48
  139. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  140. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  141. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  142. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  143. package/dist/src/tiles/image-block.d.ts +17 -17
  144. package/dist/src/tiles/image-block.js +72 -72
  145. package/dist/src/tiles/item-image.d.ts +35 -35
  146. package/dist/src/tiles/item-image.js +117 -117
  147. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  148. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  149. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  150. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  151. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  152. package/dist/src/tiles/list/tile-list.js +298 -298
  153. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  154. package/dist/src/tiles/mediatype-icon.js +47 -47
  155. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  156. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  157. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  158. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  159. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  160. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  161. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  162. package/dist/src/tiles/text-snippet-block.js +73 -73
  163. package/dist/src/tiles/tile-dispatcher.d.ts +50 -50
  164. package/dist/src/tiles/tile-dispatcher.js +185 -185
  165. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  166. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  167. package/dist/src/utils/analytics-events.d.ts +25 -24
  168. package/dist/src/utils/analytics-events.js +27 -26
  169. package/dist/src/utils/analytics-events.js.map +1 -1
  170. package/dist/src/utils/array-equals.d.ts +4 -4
  171. package/dist/src/utils/array-equals.js +10 -10
  172. package/dist/src/utils/format-count.d.ts +7 -7
  173. package/dist/src/utils/format-count.js +76 -76
  174. package/dist/src/utils/format-date.d.ts +2 -2
  175. package/dist/src/utils/format-date.js +25 -25
  176. package/dist/src/utils/format-unit-size.d.ts +2 -2
  177. package/dist/src/utils/format-unit-size.js +33 -33
  178. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  179. package/dist/src/utils/local-date-from-utc.js +15 -15
  180. package/dist/src/utils/sha1.d.ts +2 -2
  181. package/dist/src/utils/sha1.js +8 -8
  182. package/dist/test/collection-browser.test.d.ts +1 -1
  183. package/dist/test/collection-browser.test.js +984 -958
  184. package/dist/test/collection-browser.test.js.map +1 -1
  185. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  186. package/dist/test/collection-facets/facets-template.test.js +134 -134
  187. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  188. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  189. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  190. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  191. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  192. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  193. package/dist/test/collection-facets.test.d.ts +2 -2
  194. package/dist/test/collection-facets.test.js +695 -645
  195. package/dist/test/collection-facets.test.js.map +1 -1
  196. package/dist/test/empty-placeholder.test.d.ts +1 -1
  197. package/dist/test/empty-placeholder.test.js +63 -56
  198. package/dist/test/empty-placeholder.test.js.map +1 -1
  199. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  200. package/dist/test/expanded-date-picker.test.js +95 -95
  201. package/dist/test/icon-overlay.test.d.ts +1 -1
  202. package/dist/test/icon-overlay.test.js +24 -24
  203. package/dist/test/image-block.test.d.ts +1 -1
  204. package/dist/test/image-block.test.js +48 -48
  205. package/dist/test/item-image.test.d.ts +1 -1
  206. package/dist/test/item-image.test.js +84 -84
  207. package/dist/test/mediatype-config.test.d.ts +1 -1
  208. package/dist/test/mediatype-config.test.js +16 -16
  209. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  210. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  211. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  212. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  213. package/dist/test/mocks/mock-search-responses.d.ts +21 -20
  214. package/dist/test/mocks/mock-search-responses.js +707 -665
  215. package/dist/test/mocks/mock-search-responses.js.map +1 -1
  216. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  217. package/dist/test/mocks/mock-search-service.js +50 -49
  218. package/dist/test/mocks/mock-search-service.js.map +1 -1
  219. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  220. package/dist/test/restoration-state-handler.test.js +270 -270
  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 +1 -1
  264. package/renovate.json +6 -6
  265. package/src/collection-browser.ts +16 -1
  266. package/src/collection-facets.ts +66 -1
  267. package/src/utils/analytics-events.ts +1 -0
  268. package/test/collection-browser.test.ts +40 -0
  269. package/test/collection-facets.test.ts +66 -0
  270. package/test/empty-placeholder.test.ts +26 -19
  271. package/test/mocks/mock-search-responses.ts +46 -0
  272. package/test/mocks/mock-search-service.ts +2 -0
  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,18 +1,18 @@
1
- import { expect } from '@open-wc/testing';
2
- import { nothing } from 'lit';
3
- import { formatUnitSize } from '../../src/utils/format-unit-size';
4
- describe('formatUnitSize', () => {
5
- it('returns blank when undefined number', () => {
6
- expect(formatUnitSize(undefined, 1)).to.equal(nothing);
7
- });
8
- it('returns collection data is in singular form', () => {
9
- expect(formatUnitSize(1025, 1)).to.equal('1 kilobyte');
10
- });
11
- it('return collection size data in kilobytes and plural form', () => {
12
- expect(formatUnitSize(15000, 1)).to.equal('14.6 kilobytes');
13
- });
14
- it('return huge collection size data', () => {
15
- expect(formatUnitSize(454154654134, 1)).to.equal('423 gigabytes');
16
- });
17
- });
1
+ import { expect } from '@open-wc/testing';
2
+ import { nothing } from 'lit';
3
+ import { formatUnitSize } from '../../src/utils/format-unit-size';
4
+ describe('formatUnitSize', () => {
5
+ it('returns blank when undefined number', () => {
6
+ expect(formatUnitSize(undefined, 1)).to.equal(nothing);
7
+ });
8
+ it('returns collection data is in singular form', () => {
9
+ expect(formatUnitSize(1025, 1)).to.equal('1 kilobyte');
10
+ });
11
+ it('return collection size data in kilobytes and plural form', () => {
12
+ expect(formatUnitSize(15000, 1)).to.equal('14.6 kilobytes');
13
+ });
14
+ it('return huge collection size data', () => {
15
+ expect(formatUnitSize(454154654134, 1)).to.equal('423 gigabytes');
16
+ });
17
+ });
18
18
  //# sourceMappingURL=format-unit-size.test.js.map
@@ -1 +1 @@
1
- export {};
1
+ export {};
@@ -1,27 +1,27 @@
1
- import { expect } from '@open-wc/testing';
2
- import { localDateFromUTC, isFirstMillisecondOfUTCYear, } from '../../src/utils/local-date-from-utc';
3
- describe('localDateFromUTC', () => {
4
- it('converts dates from UTC to local timezone', async () => {
5
- const date = new Date(1990, 1, 2, 3, 4, 5, 6);
6
- const dateFromUTC = new Date(Date.UTC(1990, 1, 2, 3, 4, 5, 6));
7
- expect(localDateFromUTC(date).toISOString()).to.equal(dateFromUTC.toISOString());
8
- });
9
- });
10
- describe('isFirstMillisecondOfUTCYear', () => {
11
- it('returns true when date is exactly Jan 1 at midnight in UTC', async () => {
12
- const midnightOnNewYearsDay = new Date(2010, 0, 1, 0, 0, 0, 0);
13
- expect(isFirstMillisecondOfUTCYear(midnightOnNewYearsDay)).to.be.true;
14
- });
15
- it('returns false when date is not exactly Jan 1 at midnight in UTC', async () => {
16
- const oneMillisecondTooEarly = new Date(2009, 11, 31, 23, 59, 59, 999);
17
- expect(isFirstMillisecondOfUTCYear(oneMillisecondTooEarly)).to.be.false;
18
- const oneMillisecondTooLate = new Date(2010, 0, 1, 0, 0, 0, 1);
19
- expect(isFirstMillisecondOfUTCYear(oneMillisecondTooLate)).to.be.false;
20
- const middleOfTheYear = new Date(2010, 6, 1, 0, 0, 0, 0);
21
- expect(isFirstMillisecondOfUTCYear(middleOfTheYear)).to.be.false;
22
- });
23
- it('returns false when no date provided', async () => {
24
- expect(isFirstMillisecondOfUTCYear(undefined)).to.be.false;
25
- });
26
- });
1
+ import { expect } from '@open-wc/testing';
2
+ import { localDateFromUTC, isFirstMillisecondOfUTCYear, } from '../../src/utils/local-date-from-utc';
3
+ describe('localDateFromUTC', () => {
4
+ it('converts dates from UTC to local timezone', async () => {
5
+ const date = new Date(1990, 1, 2, 3, 4, 5, 6);
6
+ const dateFromUTC = new Date(Date.UTC(1990, 1, 2, 3, 4, 5, 6));
7
+ expect(localDateFromUTC(date).toISOString()).to.equal(dateFromUTC.toISOString());
8
+ });
9
+ });
10
+ describe('isFirstMillisecondOfUTCYear', () => {
11
+ it('returns true when date is exactly Jan 1 at midnight in UTC', async () => {
12
+ const midnightOnNewYearsDay = new Date(2010, 0, 1, 0, 0, 0, 0);
13
+ expect(isFirstMillisecondOfUTCYear(midnightOnNewYearsDay)).to.be.true;
14
+ });
15
+ it('returns false when date is not exactly Jan 1 at midnight in UTC', async () => {
16
+ const oneMillisecondTooEarly = new Date(2009, 11, 31, 23, 59, 59, 999);
17
+ expect(isFirstMillisecondOfUTCYear(oneMillisecondTooEarly)).to.be.false;
18
+ const oneMillisecondTooLate = new Date(2010, 0, 1, 0, 0, 0, 1);
19
+ expect(isFirstMillisecondOfUTCYear(oneMillisecondTooLate)).to.be.false;
20
+ const middleOfTheYear = new Date(2010, 6, 1, 0, 0, 0, 0);
21
+ expect(isFirstMillisecondOfUTCYear(middleOfTheYear)).to.be.false;
22
+ });
23
+ it('returns false when no date provided', async () => {
24
+ expect(isFirstMillisecondOfUTCYear(undefined)).to.be.false;
25
+ });
26
+ });
27
27
  //# sourceMappingURL=local-date-from-utc.test.js.map
@@ -1,86 +1,86 @@
1
- Certificate:
2
- Data:
3
- Version: 3 (0x2)
4
- Serial Number: 1 (0x1)
5
- Signature Algorithm: sha256WithRSAEncryption
6
- Issuer: CN=devcert
7
- Validity
8
- Not Before: Apr 27 16:27:46 2022 GMT
9
- Not After : Jul 30 16:27:46 2024 GMT
10
- Subject: CN=local.archive.org
11
- Subject Public Key Info:
12
- Public Key Algorithm: rsaEncryption
13
- Public-Key: (2048 bit)
14
- Modulus:
15
- 00:a9:54:ca:34:ff:8b:32:02:39:97:61:bd:f5:12:
16
- 5c:4a:d0:87:2e:d6:42:63:72:ea:b4:90:95:cc:4a:
17
- ef:5a:66:09:9f:1d:08:0d:b2:f4:2e:b3:55:59:9c:
18
- 0f:77:37:1e:d7:a3:5c:b7:3d:81:84:fc:55:af:20:
19
- e7:3c:bd:9e:2b:2b:9e:d1:95:9d:14:90:70:7c:99:
20
- 78:f1:dd:42:2b:fd:87:b9:09:f0:f6:50:c7:90:41:
21
- de:e2:ee:dd:a0:4a:4d:de:20:6a:e8:1b:81:7f:d9:
22
- 17:0d:f5:f2:a1:dc:89:d8:e9:89:9c:ff:40:b7:0e:
23
- bb:16:db:d1:e0:67:5f:24:de:3b:b8:18:b8:a6:dd:
24
- d5:26:8a:2a:a4:f2:03:b1:a8:15:23:31:c9:65:de:
25
- 9b:5a:b0:f0:4f:ef:77:f1:8b:7b:91:95:a0:61:be:
26
- 1f:64:29:c6:2e:2c:03:1b:f0:91:96:b6:ab:fb:11:
27
- b7:1c:41:bc:43:6e:1b:6f:28:88:40:bd:a8:47:28:
28
- 9e:a4:64:31:e0:a5:72:db:09:cb:b0:9e:7a:d5:d0:
29
- 7f:15:15:75:d4:d6:78:41:c9:a1:54:73:48:19:4f:
30
- 72:95:a1:31:b3:4c:81:41:13:43:d9:9b:8c:d0:2e:
31
- 29:09:a2:59:6b:15:6d:5c:93:22:03:f5:72:f0:46:
32
- be:65
33
- Exponent: 65537 (0x10001)
34
- X509v3 extensions:
35
- X509v3 Basic Constraints: critical
36
- CA:FALSE
37
- X509v3 Subject Key Identifier:
38
- E1:20:A8:89:51:79:0C:23:66:20:B7:A5:A4:42:8F:40:7F:7E:C0:CE
39
- X509v3 Authority Key Identifier:
40
- keyid:A8:C7:C5:69:35:49:1B:B6:77:E7:2E:16:5B:B0:75:8C:B7:03:5C:04
41
- DirName:/CN=devcert
42
- serial:DB:1E:4C:08:75:57:8D:4E
43
-
44
- X509v3 Key Usage: critical
45
- Digital Signature, Key Encipherment
46
- X509v3 Extended Key Usage:
47
- TLS Web Server Authentication
48
- X509v3 Subject Alternative Name:
49
- DNS:local.archive.org, DNS:*.local.archive.org
50
- Signature Algorithm: sha256WithRSAEncryption
51
- 5a:20:54:0b:6f:c3:35:e6:70:c1:bd:5c:58:e8:cf:7b:73:33:
52
- 38:80:70:c1:1c:60:2a:ea:5c:0c:eb:63:6a:15:48:fe:4d:f6:
53
- 18:89:e1:89:73:40:45:52:7d:bc:3a:d6:0e:d3:65:2c:e7:b9:
54
- ab:3b:c6:ea:6e:74:74:39:4f:53:3f:bb:59:d9:91:83:db:92:
55
- 96:32:97:25:5f:c2:8d:85:ce:b3:c7:b1:4d:37:b7:bd:81:de:
56
- f7:9f:34:5b:12:70:21:a8:03:8d:94:ed:d7:41:7f:2a:87:30:
57
- bd:4f:07:22:b2:9a:06:ab:bc:41:2c:2f:7c:be:e0:a2:90:60:
58
- 21:79:d4:a1:08:26:c1:f4:83:b2:0a:ff:7d:0a:15:dc:ed:d0:
59
- 49:f9:37:ad:fe:68:d7:59:9d:f8:25:4e:10:01:bf:a5:be:ec:
60
- 21:a8:bf:77:6c:ff:d4:b7:d4:11:9c:43:4a:64:e8:31:76:9a:
61
- 01:3a:54:d9:c0:8a:a6:2c:7a:df:0a:c4:26:6e:19:52:26:9d:
62
- 25:b5:b1:db:6f:12:91:92:83:ab:6c:28:52:e1:e4:63:c2:cf:
63
- 45:f7:b4:da:7d:13:66:47:62:90:e6:8d:2c:b8:aa:d4:2b:8c:
64
- d6:c0:5c:fc:83:e7:1f:71:5f:cb:38:b6:c3:a5:77:7d:97:04:
65
- 87:14:44:83
66
- -----BEGIN CERTIFICATE-----
67
- MIIDdjCCAl6gAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdkZXZj
68
- ZXJ0MB4XDTIyMDQyNzE2Mjc0NloXDTI0MDczMDE2Mjc0NlowHDEaMBgGA1UEAwwR
69
- bG9jYWwuYXJjaGl2ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
70
- AQCpVMo0/4syAjmXYb31ElxK0Icu1kJjcuq0kJXMSu9aZgmfHQgNsvQus1VZnA93
71
- Nx7Xo1y3PYGE/FWvIOc8vZ4rK57RlZ0UkHB8mXjx3UIr/Ye5CfD2UMeQQd7i7t2g
72
- Sk3eIGroG4F/2RcN9fKh3InY6Ymc/0C3DrsW29HgZ18k3ju4GLim3dUmiiqk8gOx
73
- qBUjMcll3ptasPBP73fxi3uRlaBhvh9kKcYuLAMb8JGWtqv7EbccQbxDbhtvKIhA
74
- vahHKJ6kZDHgpXLbCcuwnnrV0H8VFXXU1nhByaFUc0gZT3KVoTGzTIFBE0PZm4zQ
75
- LikJollrFW1ckyID9XLwRr5lAgMBAAGjgcwwgckwDAYDVR0TAQH/BAIwADAdBgNV
76
- HQ4EFgQU4SCoiVF5DCNmILelpEKPQH9+wM4wQgYDVR0jBDswOYAUqMfFaTVJG7Z3
77
- 5y4WW7B1jLcDXAShFqQUMBIxEDAOBgNVBAMMB2RldmNlcnSCCQDbHkwIdVeNTjAO
78
- BgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMQYDVR0RBCowKIIR
79
- bG9jYWwuYXJjaGl2ZS5vcmeCEyoubG9jYWwuYXJjaGl2ZS5vcmcwDQYJKoZIhvcN
80
- AQELBQADggEBAFogVAtvwzXmcMG9XFjoz3tzMziAcMEcYCrqXAzrY2oVSP5N9hiJ
81
- 4YlzQEVSfbw61g7TZSznuas7xupudHQ5T1M/u1nZkYPbkpYylyVfwo2FzrPHsU03
82
- t72B3vefNFsScCGoA42U7ddBfyqHML1PByKymgarvEEsL3y+4KKQYCF51KEIJsH0
83
- g7IK/30KFdzt0En5N63+aNdZnfglThABv6W+7CGov3ds/9S31BGcQ0pk6DF2mgE6
84
- VNnAiqYset8KxCZuGVImnSW1sdtvEpGSg6tsKFLh5GPCz0X3tNp9E2ZHYpDmjSy4
85
- qtQrjNbAXPyD5x9xX8s4tsOld32XBIcURIM=
86
- -----END CERTIFICATE-----
1
+ Certificate:
2
+ Data:
3
+ Version: 3 (0x2)
4
+ Serial Number: 1 (0x1)
5
+ Signature Algorithm: sha256WithRSAEncryption
6
+ Issuer: CN=devcert
7
+ Validity
8
+ Not Before: Apr 27 16:27:46 2022 GMT
9
+ Not After : Jul 30 16:27:46 2024 GMT
10
+ Subject: CN=local.archive.org
11
+ Subject Public Key Info:
12
+ Public Key Algorithm: rsaEncryption
13
+ Public-Key: (2048 bit)
14
+ Modulus:
15
+ 00:a9:54:ca:34:ff:8b:32:02:39:97:61:bd:f5:12:
16
+ 5c:4a:d0:87:2e:d6:42:63:72:ea:b4:90:95:cc:4a:
17
+ ef:5a:66:09:9f:1d:08:0d:b2:f4:2e:b3:55:59:9c:
18
+ 0f:77:37:1e:d7:a3:5c:b7:3d:81:84:fc:55:af:20:
19
+ e7:3c:bd:9e:2b:2b:9e:d1:95:9d:14:90:70:7c:99:
20
+ 78:f1:dd:42:2b:fd:87:b9:09:f0:f6:50:c7:90:41:
21
+ de:e2:ee:dd:a0:4a:4d:de:20:6a:e8:1b:81:7f:d9:
22
+ 17:0d:f5:f2:a1:dc:89:d8:e9:89:9c:ff:40:b7:0e:
23
+ bb:16:db:d1:e0:67:5f:24:de:3b:b8:18:b8:a6:dd:
24
+ d5:26:8a:2a:a4:f2:03:b1:a8:15:23:31:c9:65:de:
25
+ 9b:5a:b0:f0:4f:ef:77:f1:8b:7b:91:95:a0:61:be:
26
+ 1f:64:29:c6:2e:2c:03:1b:f0:91:96:b6:ab:fb:11:
27
+ b7:1c:41:bc:43:6e:1b:6f:28:88:40:bd:a8:47:28:
28
+ 9e:a4:64:31:e0:a5:72:db:09:cb:b0:9e:7a:d5:d0:
29
+ 7f:15:15:75:d4:d6:78:41:c9:a1:54:73:48:19:4f:
30
+ 72:95:a1:31:b3:4c:81:41:13:43:d9:9b:8c:d0:2e:
31
+ 29:09:a2:59:6b:15:6d:5c:93:22:03:f5:72:f0:46:
32
+ be:65
33
+ Exponent: 65537 (0x10001)
34
+ X509v3 extensions:
35
+ X509v3 Basic Constraints: critical
36
+ CA:FALSE
37
+ X509v3 Subject Key Identifier:
38
+ E1:20:A8:89:51:79:0C:23:66:20:B7:A5:A4:42:8F:40:7F:7E:C0:CE
39
+ X509v3 Authority Key Identifier:
40
+ keyid:A8:C7:C5:69:35:49:1B:B6:77:E7:2E:16:5B:B0:75:8C:B7:03:5C:04
41
+ DirName:/CN=devcert
42
+ serial:DB:1E:4C:08:75:57:8D:4E
43
+
44
+ X509v3 Key Usage: critical
45
+ Digital Signature, Key Encipherment
46
+ X509v3 Extended Key Usage:
47
+ TLS Web Server Authentication
48
+ X509v3 Subject Alternative Name:
49
+ DNS:local.archive.org, DNS:*.local.archive.org
50
+ Signature Algorithm: sha256WithRSAEncryption
51
+ 5a:20:54:0b:6f:c3:35:e6:70:c1:bd:5c:58:e8:cf:7b:73:33:
52
+ 38:80:70:c1:1c:60:2a:ea:5c:0c:eb:63:6a:15:48:fe:4d:f6:
53
+ 18:89:e1:89:73:40:45:52:7d:bc:3a:d6:0e:d3:65:2c:e7:b9:
54
+ ab:3b:c6:ea:6e:74:74:39:4f:53:3f:bb:59:d9:91:83:db:92:
55
+ 96:32:97:25:5f:c2:8d:85:ce:b3:c7:b1:4d:37:b7:bd:81:de:
56
+ f7:9f:34:5b:12:70:21:a8:03:8d:94:ed:d7:41:7f:2a:87:30:
57
+ bd:4f:07:22:b2:9a:06:ab:bc:41:2c:2f:7c:be:e0:a2:90:60:
58
+ 21:79:d4:a1:08:26:c1:f4:83:b2:0a:ff:7d:0a:15:dc:ed:d0:
59
+ 49:f9:37:ad:fe:68:d7:59:9d:f8:25:4e:10:01:bf:a5:be:ec:
60
+ 21:a8:bf:77:6c:ff:d4:b7:d4:11:9c:43:4a:64:e8:31:76:9a:
61
+ 01:3a:54:d9:c0:8a:a6:2c:7a:df:0a:c4:26:6e:19:52:26:9d:
62
+ 25:b5:b1:db:6f:12:91:92:83:ab:6c:28:52:e1:e4:63:c2:cf:
63
+ 45:f7:b4:da:7d:13:66:47:62:90:e6:8d:2c:b8:aa:d4:2b:8c:
64
+ d6:c0:5c:fc:83:e7:1f:71:5f:cb:38:b6:c3:a5:77:7d:97:04:
65
+ 87:14:44:83
66
+ -----BEGIN CERTIFICATE-----
67
+ MIIDdjCCAl6gAwIBAgIBATANBgkqhkiG9w0BAQsFADASMRAwDgYDVQQDDAdkZXZj
68
+ ZXJ0MB4XDTIyMDQyNzE2Mjc0NloXDTI0MDczMDE2Mjc0NlowHDEaMBgGA1UEAwwR
69
+ bG9jYWwuYXJjaGl2ZS5vcmcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIB
70
+ AQCpVMo0/4syAjmXYb31ElxK0Icu1kJjcuq0kJXMSu9aZgmfHQgNsvQus1VZnA93
71
+ Nx7Xo1y3PYGE/FWvIOc8vZ4rK57RlZ0UkHB8mXjx3UIr/Ye5CfD2UMeQQd7i7t2g
72
+ Sk3eIGroG4F/2RcN9fKh3InY6Ymc/0C3DrsW29HgZ18k3ju4GLim3dUmiiqk8gOx
73
+ qBUjMcll3ptasPBP73fxi3uRlaBhvh9kKcYuLAMb8JGWtqv7EbccQbxDbhtvKIhA
74
+ vahHKJ6kZDHgpXLbCcuwnnrV0H8VFXXU1nhByaFUc0gZT3KVoTGzTIFBE0PZm4zQ
75
+ LikJollrFW1ckyID9XLwRr5lAgMBAAGjgcwwgckwDAYDVR0TAQH/BAIwADAdBgNV
76
+ HQ4EFgQU4SCoiVF5DCNmILelpEKPQH9+wM4wQgYDVR0jBDswOYAUqMfFaTVJG7Z3
77
+ 5y4WW7B1jLcDXAShFqQUMBIxEDAOBgNVBAMMB2RldmNlcnSCCQDbHkwIdVeNTjAO
78
+ BgNVHQ8BAf8EBAMCBaAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwMQYDVR0RBCowKIIR
79
+ bG9jYWwuYXJjaGl2ZS5vcmeCEyoubG9jYWwuYXJjaGl2ZS5vcmcwDQYJKoZIhvcN
80
+ AQELBQADggEBAFogVAtvwzXmcMG9XFjoz3tzMziAcMEcYCrqXAzrY2oVSP5N9hiJ
81
+ 4YlzQEVSfbw61g7TZSznuas7xupudHQ5T1M/u1nZkYPbkpYylyVfwo2FzrPHsU03
82
+ t72B3vefNFsScCGoA42U7ddBfyqHML1PByKymgarvEEsL3y+4KKQYCF51KEIJsH0
83
+ g7IK/30KFdzt0En5N63+aNdZnfglThABv6W+7CGov3ds/9S31BGcQ0pk6DF2mgE6
84
+ VNnAiqYset8KxCZuGVImnSW1sdtvEpGSg6tsKFLh5GPCz0X3tNp9E2ZHYpDmjSy4
85
+ qtQrjNbAXPyD5x9xX8s4tsOld32XBIcURIM=
86
+ -----END CERTIFICATE-----
@@ -1,27 +1,27 @@
1
- -----BEGIN RSA PRIVATE KEY-----
2
- MIIEowIBAAKCAQEAqVTKNP+LMgI5l2G99RJcStCHLtZCY3LqtJCVzErvWmYJnx0I
3
- DbL0LrNVWZwPdzce16Nctz2BhPxVryDnPL2eKyue0ZWdFJBwfJl48d1CK/2HuQnw
4
- 9lDHkEHe4u7doEpN3iBq6BuBf9kXDfXyodyJ2OmJnP9Atw67FtvR4GdfJN47uBi4
5
- pt3VJooqpPIDsagVIzHJZd6bWrDwT+938Yt7kZWgYb4fZCnGLiwDG/CRlrar+xG3
6
- HEG8Q24bbyiIQL2oRyiepGQx4KVy2wnLsJ561dB/FRV11NZ4QcmhVHNIGU9ylaEx
7
- s0yBQRND2ZuM0C4pCaJZaxVtXJMiA/Vy8Ea+ZQIDAQABAoIBAAQgUdEazQyJ61da
8
- BWP8b41PKYwlonaD7V47C7tvtAdy5xcegPy8eKDOs+y8FdBk4naEv5Sjhg10jK34
9
- 0kmzoTASHwuiZrKClosivkS+jIc/5VfH+zw1WbeVM1Y6VeI7DUy1Y4WGbhBsfNhV
10
- PvVcx2smvbi6q5wKWtrCvomGW1YtngNBXJBPDWXysaVZdpF+6iWtw0RjWxbKEeMb
11
- fjZ2sxl7h1EkTXxQR9pfl9WVgl6vRRXp1o+N71M14jp5t95xCyf49YzeEuZmc1Fc
12
- dD77LNGcxr3kpkcQH5FdDP/spla+lR+JKb78FVqhEdPP3WcJ1qcrAstG2npAfKpj
13
- MD9AhsECgYEA3BddOjeK9epaGbTZRKgmIOSgGEHo8WbVHqBHhyQKAb8kFVEPn+Hl
14
- sq2EEQZf0ZJ/HhlVBc0Gj4/2PI8vj1Lzh+QWJnFu+XN/doOm5X62Ctz13qC5oWJp
15
- foQ9HXcg4GAXhm/o3KUIntLrUwoi/UW8YOSRFXS8RSJtuh1rI5P2jjECgYEAxPVP
16
- o/9+12Fc2ujdm8cQ1tB1Ab9Z73/vloG/xit0uMp89OqXUHEmtud/WzaIQvNxdaWi
17
- 9/BqAG9Oml51T3cuYPxNDkSmtd2fieq9Nh17dw8zYGMk0cSYeecgvCJOrRIJnebW
18
- Glyt8vzBb3eD6FzhZoVNOVYareainSP1cwl5YnUCgYAsr2m0OjayeyRT983tDJ7B
19
- Kun+QtOCv7ghgbVEEOMfO6md0llzwq+aOXSI6Fxn9nBssgP7K4dbeoUqAoBLfzIG
20
- sx50K6+2YebNLymhirp3NimNS+CkjZCRqVOnOdqo85mTKAGFWtSHOpegwnwcJB59
21
- Jar3Sj43YygYE4T/Mjlq4QKBgQC8zUcdt2J4xl1Df6xHkuiic0tmdG6a9jHOPex+
22
- 49NM/NYR1Ptd4kmxVXKxFjJCs6jUlQYG1NBYQFrCAcBEf8PWtqSLA+YnOh6gD4R3
23
- ZoWfGNQwFnoKF4HugU/Q6LYwk7TiR5B/zs30urQWzSOGT9rF8wyW5OJIR2kkZ373
24
- WmKgrQKBgGaw32CMejz3wBpzOAXsYJcMsVfNCMD4bJ2EbXhYuY8HB8IEEv6wqMsp
25
- wtXIgHJubfIiA3MlVsfaUkRdtHMHbN+Us1oynu6nByLhYlAMKpOsJFzPVHHwGB/1
26
- g3WtzfFk5eOoZltJBm5K41zjS7lyr1t05648pT6niy9snu6LaF94
27
- -----END RSA PRIVATE KEY-----
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIIEowIBAAKCAQEAqVTKNP+LMgI5l2G99RJcStCHLtZCY3LqtJCVzErvWmYJnx0I
3
+ DbL0LrNVWZwPdzce16Nctz2BhPxVryDnPL2eKyue0ZWdFJBwfJl48d1CK/2HuQnw
4
+ 9lDHkEHe4u7doEpN3iBq6BuBf9kXDfXyodyJ2OmJnP9Atw67FtvR4GdfJN47uBi4
5
+ pt3VJooqpPIDsagVIzHJZd6bWrDwT+938Yt7kZWgYb4fZCnGLiwDG/CRlrar+xG3
6
+ HEG8Q24bbyiIQL2oRyiepGQx4KVy2wnLsJ561dB/FRV11NZ4QcmhVHNIGU9ylaEx
7
+ s0yBQRND2ZuM0C4pCaJZaxVtXJMiA/Vy8Ea+ZQIDAQABAoIBAAQgUdEazQyJ61da
8
+ BWP8b41PKYwlonaD7V47C7tvtAdy5xcegPy8eKDOs+y8FdBk4naEv5Sjhg10jK34
9
+ 0kmzoTASHwuiZrKClosivkS+jIc/5VfH+zw1WbeVM1Y6VeI7DUy1Y4WGbhBsfNhV
10
+ PvVcx2smvbi6q5wKWtrCvomGW1YtngNBXJBPDWXysaVZdpF+6iWtw0RjWxbKEeMb
11
+ fjZ2sxl7h1EkTXxQR9pfl9WVgl6vRRXp1o+N71M14jp5t95xCyf49YzeEuZmc1Fc
12
+ dD77LNGcxr3kpkcQH5FdDP/spla+lR+JKb78FVqhEdPP3WcJ1qcrAstG2npAfKpj
13
+ MD9AhsECgYEA3BddOjeK9epaGbTZRKgmIOSgGEHo8WbVHqBHhyQKAb8kFVEPn+Hl
14
+ sq2EEQZf0ZJ/HhlVBc0Gj4/2PI8vj1Lzh+QWJnFu+XN/doOm5X62Ctz13qC5oWJp
15
+ foQ9HXcg4GAXhm/o3KUIntLrUwoi/UW8YOSRFXS8RSJtuh1rI5P2jjECgYEAxPVP
16
+ o/9+12Fc2ujdm8cQ1tB1Ab9Z73/vloG/xit0uMp89OqXUHEmtud/WzaIQvNxdaWi
17
+ 9/BqAG9Oml51T3cuYPxNDkSmtd2fieq9Nh17dw8zYGMk0cSYeecgvCJOrRIJnebW
18
+ Glyt8vzBb3eD6FzhZoVNOVYareainSP1cwl5YnUCgYAsr2m0OjayeyRT983tDJ7B
19
+ Kun+QtOCv7ghgbVEEOMfO6md0llzwq+aOXSI6Fxn9nBssgP7K4dbeoUqAoBLfzIG
20
+ sx50K6+2YebNLymhirp3NimNS+CkjZCRqVOnOdqo85mTKAGFWtSHOpegwnwcJB59
21
+ Jar3Sj43YygYE4T/Mjlq4QKBgQC8zUcdt2J4xl1Df6xHkuiic0tmdG6a9jHOPex+
22
+ 49NM/NYR1Ptd4kmxVXKxFjJCs6jUlQYG1NBYQFrCAcBEf8PWtqSLA+YnOh6gD4R3
23
+ ZoWfGNQwFnoKF4HugU/Q6LYwk7TiR5B/zs30urQWzSOGT9rF8wyW5OJIR2kkZ373
24
+ WmKgrQKBgGaw32CMejz3wBpzOAXsYJcMsVfNCMD4bJ2EbXhYuY8HB8IEEv6wqMsp
25
+ wtXIgHJubfIiA3MlVsfaUkRdtHMHbN+Us1oynu6nByLhYlAMKpOsJFzPVHHwGB/1
26
+ g3WtzfFk5eOoZltJBm5K41zjS7lyr1t05648pT6niy9snu6LaF94
27
+ -----END RSA PRIVATE KEY-----
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "1.11.1-alpha.3",
6
+ "version": "1.13.0-alpha1",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
package/renovate.json CHANGED
@@ -1,6 +1,6 @@
1
- {
2
- "extends": [
3
- "config:base",
4
- ":preserveSemverRanges"
5
- ]
6
- }
1
+ {
2
+ "extends": [
3
+ "config:base",
4
+ ":preserveSemverRanges"
5
+ ]
6
+ }
@@ -127,6 +127,8 @@ export class CollectionBrowser
127
127
 
128
128
  @property({ type: Object }) collectionInfo?: CollectionExtraInfo;
129
129
 
130
+ @property({ type: Array }) parentCollections: string[] = [];
131
+
130
132
  /** describes where this component is being used */
131
133
  @property({ type: String, reflect: true }) searchContext: string =
132
134
  analyticsCategories.default;
@@ -760,6 +762,7 @@ export class CollectionBrowser
760
762
  @facetsChanged=${this.facetsChanged}
761
763
  @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
762
764
  .collectionPagePath=${this.collectionPagePath}
765
+ .parentCollections=${this.parentCollections}
763
766
  .withinCollection=${this.withinCollection}
764
767
  .searchService=${this.searchService}
765
768
  .featureFeedbackService=${this.featureFeedbackService}
@@ -771,6 +774,7 @@ export class CollectionBrowser
771
774
  .minSelectedDate=${this.minSelectedDate}
772
775
  .maxSelectedDate=${this.maxSelectedDate}
773
776
  .selectedFacets=${this.selectedFacets}
777
+ .baseNavigationUrl=${this.baseNavigationUrl}
774
778
  .collectionNameCache=${this.collectionNameCache}
775
779
  .showHistogramDatePicker=${this.showHistogramDatePicker}
776
780
  .allowExpandingDatePicker=${!this.mobileView}
@@ -1799,13 +1803,24 @@ export class CollectionBrowser
1799
1803
  }
1800
1804
 
1801
1805
  this.totalResults = success.response.totalResults;
1806
+ if (this.totalResults === 0) {
1807
+ this.dispatchEvent(new CustomEvent('tabChanged', { bubbles : true, detail: 'about', composed : true }));
1808
+ console.log('dispatched');;
1809
+ }
1810
+ console.log(this.totalResults)
1802
1811
 
1803
1812
  if (this.withinCollection) {
1804
1813
  this.collectionInfo = success.response.collectionExtraInfo;
1805
1814
 
1806
1815
  // For collections, we want the UI to respect the default sort option
1807
1816
  // which can be specified in metadata, or otherwise assumed to be week:desc
1808
- this.applyDefaultCollectionSort(success.response.collectionExtraInfo);
1817
+ this.applyDefaultCollectionSort(this.collectionInfo);
1818
+
1819
+ if (this.collectionInfo) {
1820
+ this.parentCollections = [].concat(
1821
+ this.collectionInfo.public_metadata?.collection ?? []
1822
+ );
1823
+ }
1809
1824
  }
1810
1825
 
1811
1826
  const { results, collectionTitles } = success.response;
@@ -10,6 +10,7 @@ import {
10
10
  import { customElement, property, state } from 'lit/decorators.js';
11
11
  import { map } from 'lit/directives/map.js';
12
12
  import { ref } from 'lit/directives/ref.js';
13
+ import { msg } from '@lit/localize';
13
14
  import type {
14
15
  Aggregation,
15
16
  AggregationSortType,
@@ -88,9 +89,13 @@ export class CollectionFacets extends LitElement {
88
89
 
89
90
  @property({ type: String }) query?: string;
90
91
 
92
+ @property({ type: String }) withinCollection?: string;
93
+
94
+ @property({ type: Array }) parentCollections: string[] = [];
95
+
91
96
  @property({ type: Object }) filterMap?: FilterMap;
92
97
 
93
- @property({ type: String }) withinCollection?: string;
98
+ @property({ type: String }) baseNavigationUrl?: string;
94
99
 
95
100
  @property({ type: String }) collectionPagePath: string = '/details/';
96
101
 
@@ -143,6 +148,7 @@ export class CollectionFacets extends LitElement {
143
148
  </section>
144
149
  `
145
150
  : nothing}
151
+ ${this.collectionPartOfTemplate}
146
152
  ${this.mergedFacets.map(facetGroup =>
147
153
  this.getFacetGroupTemplate(facetGroup)
148
154
  )}
@@ -150,6 +156,51 @@ export class CollectionFacets extends LitElement {
150
156
  `;
151
157
  }
152
158
 
159
+ private get collectionPartOfTemplate(): TemplateResult | typeof nothing {
160
+ // We only display the "Part Of" section on collection pages
161
+ if (!this.withinCollection || this.parentCollections.length === 0)
162
+ return nothing;
163
+
164
+ const headingId = 'partof-heading';
165
+ return html`
166
+ <section
167
+ class="facet-group partof-collections"
168
+ aria-labelledby=${headingId}
169
+ >
170
+ <div class="facet-group-header">
171
+ <h3 id=${headingId}>${msg('Part Of')}</h3>
172
+ </div>
173
+ <ul>
174
+ ${map(this.parentCollections, collxn => {
175
+ const collectionURL = `${this.baseNavigationUrl}${this.collectionPagePath}${collxn}`;
176
+
177
+ return html` <li>
178
+ <a
179
+ href=${collectionURL}
180
+ data-id=${collxn}
181
+ @click=${this.partOfCollectionClicked}
182
+ >
183
+ <async-collection-name
184
+ .collectionNameCache=${this.collectionNameCache}
185
+ .identifier=${collxn}
186
+ placeholder=${collxn}
187
+ ></async-collection-name>
188
+ </a>
189
+ </li>`;
190
+ })}
191
+ </ul>
192
+ </section>
193
+ `;
194
+ }
195
+
196
+ private partOfCollectionClicked(e: Event): void {
197
+ this.analyticsHandler?.sendEvent({
198
+ category: analyticsCategories.default,
199
+ action: analyticsActions.partOfCollectionClicked,
200
+ label: (e.target as HTMLElement).dataset.id,
201
+ });
202
+ }
203
+
153
204
  /**
154
205
  * Opens a modal dialog containing an enlarged version of the date picker.
155
206
  */
@@ -652,6 +703,14 @@ export class CollectionFacets extends LitElement {
652
703
  return [
653
704
  srOnlyStyle,
654
705
  css`
706
+ a:link {
707
+ text-decoration: none;
708
+ color: var(--ia-theme-link-color, #4b64ff);
709
+ }
710
+ a:link:hover {
711
+ text-decoration: underline;
712
+ }
713
+
655
714
  #container.loading {
656
715
  opacity: 0.5;
657
716
  }
@@ -711,6 +770,12 @@ export class CollectionFacets extends LitElement {
711
770
  max-height: 2000px;
712
771
  }
713
772
 
773
+ .partof-collections ul {
774
+ list-style-type: none;
775
+ padding: 0;
776
+ font-size: 1.2rem;
777
+ }
778
+
714
779
  h3 {
715
780
  font-size: 1.4rem;
716
781
  font-weight: 200
@@ -14,6 +14,7 @@ export enum analyticsActions {
14
14
  facetDeselected = 'facetDeselected',
15
15
  facetNegativeSelected = 'facetNegativeSelected',
16
16
  facetNegativeDeselected = 'facetNegativeDeselected',
17
+ partOfCollectionClicked = 'partOfCollectionClicked',
17
18
  histogramChanged = 'histogramChanged',
18
19
  histogramChangedFromModal = 'histogramChangedFromModal',
19
20
  histogramExpanded = 'histogramExpanded',
@@ -561,6 +561,29 @@ describe('Collection Browser', () => {
561
561
  expect(errorDetails.textContent).to.contain('foo');
562
562
  });
563
563
 
564
+ it('shows error message when error response received for a collection', async () => {
565
+ const searchService = new MockSearchService();
566
+ const el = await fixture<CollectionBrowser>(
567
+ html`<collection-browser
568
+ .searchService=${searchService}
569
+ ></collection-browser>`
570
+ );
571
+
572
+ el.withinCollection = 'error';
573
+ await el.updateComplete;
574
+ await el.initialSearchComplete;
575
+
576
+ const errorPlaceholder = el.shadowRoot?.querySelector(
577
+ 'empty-placeholder'
578
+ ) as EmptyPlaceholder;
579
+ const errorDetails = errorPlaceholder?.shadowRoot?.querySelector(
580
+ '.error-details'
581
+ ) as HTMLParagraphElement;
582
+
583
+ expect(errorDetails).to.exist;
584
+ expect(errorDetails.textContent).to.contain('foo');
585
+ });
586
+
564
587
  it('reports malformed response errors to Sentry', async () => {
565
588
  const sentrySpy = sinon.spy();
566
589
  (window as any).Sentry = { captureMessage: sentrySpy };
@@ -1153,6 +1176,23 @@ describe('Collection Browser', () => {
1153
1176
  expect(mobileFacets).to.exist;
1154
1177
  });
1155
1178
 
1179
+ it('sets parent collections to prop when searching a collection', async () => {
1180
+ const searchService = new MockSearchService();
1181
+ const el = await fixture<CollectionBrowser>(
1182
+ html`<collection-browser
1183
+ .searchService=${searchService}
1184
+ .withinCollection=${'fake'}
1185
+ ></collection-browser>`
1186
+ );
1187
+
1188
+ el.baseQuery = 'parent-collections';
1189
+ await el.updateComplete;
1190
+ await el.initialSearchComplete;
1191
+ await aTimeout(0);
1192
+
1193
+ expect(el.parentCollections).to.deep.equal(['foo', 'bar']);
1194
+ });
1195
+
1156
1196
  it('refreshes when certain properties change - with some analytics event sampling', async () => {
1157
1197
  const mockAnalyticsHandler = new MockAnalyticsHandler();
1158
1198
  const searchService = new MockSearchService();
@@ -16,6 +16,7 @@ import {
16
16
  getDefaultSelectedFacets,
17
17
  } from '../src/models';
18
18
  import { MockAnalyticsHandler } from './mocks/mock-analytics-handler';
19
+ import { MockCollectionNameCache } from './mocks/mock-collection-name-cache';
19
20
 
20
21
  describe('Collection Facets', () => {
21
22
  it('has loader', async () => {
@@ -814,6 +815,41 @@ describe('Collection Facets', () => {
814
815
  expect(mockAnalyticsHandler.callLabel).to.equal('subject');
815
816
  });
816
817
 
818
+ it('includes Part Of section for collections', async () => {
819
+ const mockCollectionNameCache = new MockCollectionNameCache();
820
+ const el = await fixture<CollectionFacets>(
821
+ html`<collection-facets
822
+ .baseNavigationUrl=${''}
823
+ .withinCollection=${'foo'}
824
+ .parentCollections=${['bar', 'baz']}
825
+ .collectionNameCache=${mockCollectionNameCache}
826
+ ></collection-facets>`
827
+ );
828
+
829
+ const partOfSection = el.shadowRoot?.querySelector('.partof-collections');
830
+ expect(partOfSection).to.exist;
831
+
832
+ const partOfLinks = partOfSection?.querySelectorAll('a[href]');
833
+ expect(partOfLinks?.length).to.equal(2);
834
+
835
+ expect(partOfLinks?.[0]?.textContent?.trim()).to.equal('bar-name');
836
+ expect(partOfLinks?.[0]?.getAttribute('href')).to.equal('/details/bar');
837
+ expect(partOfLinks?.[1]?.textContent?.trim()).to.equal('baz-name');
838
+ expect(partOfLinks?.[1]?.getAttribute('href')).to.equal('/details/baz');
839
+ });
840
+
841
+ it('does not include Part Of section outside of collections', async () => {
842
+ // No withinCollection prop
843
+ const el = await fixture<CollectionFacets>(
844
+ html`<collection-facets
845
+ .parentCollections=${['bar', 'baz']}
846
+ ></collection-facets>`
847
+ );
848
+
849
+ const partOfSection = el.shadowRoot?.querySelector('.partof-collections');
850
+ expect(partOfSection).not.to.exist;
851
+ });
852
+
817
853
  it('fires analytics on expanding date picker', async () => {
818
854
  const mockAnalyticsHandler = new MockAnalyticsHandler();
819
855
 
@@ -846,4 +882,34 @@ describe('Collection Facets', () => {
846
882
  expect(mockAnalyticsHandler.callAction).to.equal('histogramExpanded');
847
883
  expect(mockAnalyticsHandler.callLabel).to.equal(window.location.href);
848
884
  });
885
+
886
+ it('fires analytics on clicking Part Of collection link', async () => {
887
+ const mockCollectionNameCache = new MockCollectionNameCache();
888
+ const mockAnalyticsHandler = new MockAnalyticsHandler();
889
+
890
+ const el = await fixture<CollectionFacets>(
891
+ html`<collection-facets
892
+ .baseNavigationUrl=${''}
893
+ .withinCollection=${'foo'}
894
+ .parentCollections=${['bar']}
895
+ .collectionNameCache=${mockCollectionNameCache}
896
+ .analyticsHandler=${mockAnalyticsHandler}
897
+ ></collection-facets>`
898
+ );
899
+
900
+ const partOfLinks = el.shadowRoot?.querySelectorAll(
901
+ '.partof-collections a[href]'
902
+ );
903
+ expect(partOfLinks?.length).to.equal(1);
904
+
905
+ // Click the expand button to open the modal
906
+ const link = partOfLinks?.[0] as HTMLAnchorElement;
907
+ link?.addEventListener('click', e => e.preventDefault());
908
+ link?.click();
909
+ await el.updateComplete;
910
+
911
+ expect(mockAnalyticsHandler.callCategory).to.equal('collection-browser');
912
+ expect(mockAnalyticsHandler.callAction).to.equal('partOfCollectionClicked');
913
+ expect(mockAnalyticsHandler.callLabel).to.equal('bar');
914
+ });
849
915
  });