@universityofmaryland/web-feeds-library 1.2.6 → 1.3.0-beta.1

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 (386) hide show
  1. package/README.md +1 -1
  2. package/dist/academic.d.ts +1 -1
  3. package/dist/academic.js +4 -4
  4. package/dist/academic.js.map +1 -1
  5. package/dist/events.d.ts +1 -1
  6. package/dist/events.js +10 -10
  7. package/dist/events.js.map +1 -1
  8. package/dist/experts.d.ts +2 -0
  9. package/dist/experts.js +9 -0
  10. package/dist/experts.js.map +1 -0
  11. package/dist/factory/core/createBaseFeed.d.ts +3 -0
  12. package/dist/factory/core/createBaseFeed.d.ts.map +1 -0
  13. package/dist/factory/core/createBaseFeed.js +116 -0
  14. package/dist/factory/core/createBaseFeed.js.map +1 -0
  15. package/dist/factory/core/index.d.ts +3 -0
  16. package/dist/factory/core/index.d.ts.map +1 -0
  17. package/dist/factory/core/types.d.ts +92 -0
  18. package/dist/factory/core/types.d.ts.map +1 -0
  19. package/dist/factory/helpers/displayHandler.d.ts +29 -0
  20. package/dist/factory/helpers/displayHandler.d.ts.map +1 -0
  21. package/dist/factory/helpers/displayHandler.js +169 -0
  22. package/dist/factory/helpers/displayHandler.js.map +1 -0
  23. package/dist/factory/helpers/feedHelpers.d.ts +10 -0
  24. package/dist/factory/helpers/feedHelpers.d.ts.map +1 -0
  25. package/dist/factory/helpers/feedHelpers.js +32 -0
  26. package/dist/factory/helpers/feedHelpers.js.map +1 -0
  27. package/dist/factory/helpers/fetchHandler.d.ts +22 -0
  28. package/dist/factory/helpers/fetchHandler.d.ts.map +1 -0
  29. package/dist/factory/helpers/fetchHandler.js +123 -0
  30. package/dist/factory/helpers/fetchHandler.js.map +1 -0
  31. package/dist/factory/helpers/index.d.ts +4 -0
  32. package/dist/factory/helpers/index.d.ts.map +1 -0
  33. package/dist/factory/index.d.ts +4 -0
  34. package/dist/factory/index.d.ts.map +1 -0
  35. package/dist/feeds/academic/_types.d.ts.map +1 -0
  36. package/dist/feeds/academic/index.d.ts +2 -0
  37. package/dist/feeds/academic/index.d.ts.map +1 -0
  38. package/dist/feeds/academic/slider.d.ts +4 -0
  39. package/dist/feeds/academic/slider.d.ts.map +1 -0
  40. package/dist/feeds/academic/slider.js +11 -0
  41. package/dist/feeds/academic/slider.js.map +1 -0
  42. package/dist/feeds/events/_types.d.ts.map +1 -0
  43. package/dist/feeds/events/grid.d.ts +4 -0
  44. package/dist/feeds/events/grid.d.ts.map +1 -0
  45. package/dist/feeds/events/grid.js +32 -0
  46. package/dist/feeds/events/grid.js.map +1 -0
  47. package/dist/feeds/events/grouped.d.ts +4 -0
  48. package/dist/feeds/events/grouped.d.ts.map +1 -0
  49. package/dist/feeds/events/grouped.js +337 -0
  50. package/dist/feeds/events/grouped.js.map +1 -0
  51. package/dist/feeds/events/index.d.ts +5 -0
  52. package/dist/feeds/events/index.d.ts.map +1 -0
  53. package/dist/feeds/events/list.d.ts +4 -0
  54. package/dist/feeds/events/list.d.ts.map +1 -0
  55. package/dist/feeds/events/list.js +33 -0
  56. package/dist/feeds/events/list.js.map +1 -0
  57. package/dist/feeds/events/slider.d.ts +4 -0
  58. package/dist/feeds/events/slider.d.ts.map +1 -0
  59. package/dist/feeds/events/slider.js +11 -0
  60. package/dist/feeds/events/slider.js.map +1 -0
  61. package/dist/feeds/experts/_types.d.ts +23 -0
  62. package/dist/feeds/experts/_types.d.ts.map +1 -0
  63. package/dist/feeds/experts/bio.d.ts +4 -0
  64. package/dist/feeds/experts/bio.d.ts.map +1 -0
  65. package/dist/feeds/experts/bio.js +147 -0
  66. package/dist/feeds/experts/bio.js.map +1 -0
  67. package/dist/feeds/experts/grid.d.ts +4 -0
  68. package/dist/feeds/experts/grid.d.ts.map +1 -0
  69. package/dist/feeds/experts/grid.js +37 -0
  70. package/dist/feeds/experts/grid.js.map +1 -0
  71. package/dist/feeds/experts/index.d.ts +4 -0
  72. package/dist/feeds/experts/index.d.ts.map +1 -0
  73. package/dist/feeds/experts/list.d.ts +4 -0
  74. package/dist/feeds/experts/list.d.ts.map +1 -0
  75. package/dist/feeds/experts/list.js +26 -0
  76. package/dist/feeds/experts/list.js.map +1 -0
  77. package/dist/feeds/news/_types.d.ts.map +1 -0
  78. package/dist/feeds/news/featured.d.ts +4 -0
  79. package/dist/feeds/news/featured.d.ts.map +1 -0
  80. package/dist/feeds/news/featured.js +379 -0
  81. package/dist/feeds/news/featured.js.map +1 -0
  82. package/dist/feeds/news/grid.d.ts +4 -0
  83. package/dist/feeds/news/grid.d.ts.map +1 -0
  84. package/dist/feeds/news/grid.js +37 -0
  85. package/dist/feeds/news/grid.js.map +1 -0
  86. package/dist/feeds/news/index.d.ts +4 -0
  87. package/dist/feeds/news/index.d.ts.map +1 -0
  88. package/dist/feeds/news/list.d.ts +4 -0
  89. package/dist/feeds/news/list.d.ts.map +1 -0
  90. package/dist/feeds/news/list.js +34 -0
  91. package/dist/feeds/news/list.js.map +1 -0
  92. package/dist/{utilities → helpers}/events/index.d.ts +1 -0
  93. package/dist/helpers/events/index.d.ts.map +1 -0
  94. package/dist/{utilities/events/index.mjs → helpers/events/index.js} +3 -1
  95. package/dist/helpers/events/index.js.map +1 -0
  96. package/dist/helpers/grouping/events.d.ts +14 -0
  97. package/dist/helpers/grouping/events.d.ts.map +1 -0
  98. package/dist/helpers/grouping/events.js +147 -0
  99. package/dist/helpers/grouping/events.js.map +1 -0
  100. package/dist/helpers/grouping/index.d.ts +2 -0
  101. package/dist/helpers/grouping/index.d.ts.map +1 -0
  102. package/dist/helpers/index.d.ts +5 -0
  103. package/dist/helpers/index.d.ts.map +1 -0
  104. package/dist/helpers/network/fetch.d.ts.map +1 -0
  105. package/dist/helpers/network/index.d.ts.map +1 -0
  106. package/dist/helpers/styles/index.d.ts +2 -0
  107. package/dist/helpers/styles/index.d.ts.map +1 -0
  108. package/dist/helpers/styles/shadow.d.ts +10 -0
  109. package/dist/helpers/styles/shadow.d.ts.map +1 -0
  110. package/dist/helpers/styles/shadow.js +16 -0
  111. package/dist/helpers/styles/shadow.js.map +1 -0
  112. package/dist/index.d.ts +4 -3
  113. package/dist/index.d.ts.map +1 -1
  114. package/dist/index.js +10 -8
  115. package/dist/index.js.map +1 -1
  116. package/dist/news.d.ts +1 -1
  117. package/dist/news.js +8 -8
  118. package/dist/news.js.map +1 -1
  119. package/dist/states/_types.d.ts +36 -0
  120. package/dist/states/_types.d.ts.map +1 -0
  121. package/dist/states/_types.js +12 -0
  122. package/dist/states/_types.js.map +1 -0
  123. package/dist/states/announcer.d.ts +14 -0
  124. package/dist/states/announcer.d.ts.map +1 -0
  125. package/dist/states/announcer.js +62 -0
  126. package/dist/states/announcer.js.map +1 -0
  127. package/dist/states/empty.d.ts +15 -0
  128. package/dist/states/empty.d.ts.map +1 -0
  129. package/dist/states/empty.js +104 -0
  130. package/dist/states/empty.js.map +1 -0
  131. package/dist/states/index.d.ts +6 -0
  132. package/dist/states/index.d.ts.map +1 -0
  133. package/dist/states/loading.d.ts +15 -0
  134. package/dist/states/loading.d.ts.map +1 -0
  135. package/dist/{macros/loader.mjs → states/loading.js} +71 -28
  136. package/dist/states/loading.js.map +1 -0
  137. package/dist/states/pagination.d.ts +17 -0
  138. package/dist/states/pagination.d.ts.map +1 -0
  139. package/dist/states/pagination.js +102 -0
  140. package/dist/states/pagination.js.map +1 -0
  141. package/dist/strategies/display/events.d.ts +4 -0
  142. package/dist/strategies/display/events.d.ts.map +1 -0
  143. package/dist/strategies/display/events.js +60 -0
  144. package/dist/strategies/display/events.js.map +1 -0
  145. package/dist/strategies/display/experts.d.ts +19 -0
  146. package/dist/strategies/display/experts.d.ts.map +1 -0
  147. package/dist/strategies/display/experts.js +266 -0
  148. package/dist/strategies/display/experts.js.map +1 -0
  149. package/dist/strategies/display/index.d.ts +5 -0
  150. package/dist/strategies/display/index.d.ts.map +1 -0
  151. package/dist/strategies/display/news.d.ts +4 -0
  152. package/dist/strategies/display/news.d.ts.map +1 -0
  153. package/dist/strategies/display/news.js +58 -0
  154. package/dist/strategies/display/news.js.map +1 -0
  155. package/dist/strategies/fetch/academic.d.ts +2 -0
  156. package/dist/strategies/fetch/academic.d.ts.map +1 -0
  157. package/dist/strategies/fetch/academic.js +30 -0
  158. package/dist/strategies/fetch/academic.js.map +1 -0
  159. package/dist/strategies/fetch/events.d.ts +20 -0
  160. package/dist/strategies/fetch/events.d.ts.map +1 -0
  161. package/dist/strategies/fetch/events.js +223 -0
  162. package/dist/strategies/fetch/events.js.map +1 -0
  163. package/dist/strategies/fetch/experts.d.ts +4 -0
  164. package/dist/strategies/fetch/experts.d.ts.map +1 -0
  165. package/dist/strategies/fetch/experts.js +194 -0
  166. package/dist/strategies/fetch/experts.js.map +1 -0
  167. package/dist/strategies/fetch/graphql.d.ts +13 -0
  168. package/dist/strategies/fetch/graphql.d.ts.map +1 -0
  169. package/dist/strategies/fetch/graphql.js +104 -0
  170. package/dist/strategies/fetch/graphql.js.map +1 -0
  171. package/dist/strategies/fetch/index.d.ts +10 -0
  172. package/dist/strategies/fetch/index.d.ts.map +1 -0
  173. package/dist/strategies/fetch/news.d.ts +4 -0
  174. package/dist/strategies/fetch/news.d.ts.map +1 -0
  175. package/dist/strategies/fetch/news.js +95 -0
  176. package/dist/strategies/fetch/news.js.map +1 -0
  177. package/dist/strategies/index.d.ts +7 -0
  178. package/dist/strategies/index.d.ts.map +1 -0
  179. package/dist/strategies/layout/featured.d.ts +8 -0
  180. package/dist/strategies/layout/featured.d.ts.map +1 -0
  181. package/dist/strategies/layout/grid.d.ts +7 -0
  182. package/dist/strategies/layout/grid.d.ts.map +1 -0
  183. package/dist/strategies/layout/grid.js +36 -0
  184. package/dist/strategies/layout/grid.js.map +1 -0
  185. package/dist/strategies/layout/index.d.ts +4 -0
  186. package/dist/strategies/layout/index.d.ts.map +1 -0
  187. package/dist/types/api.d.ts +34 -0
  188. package/dist/types/api.d.ts.map +1 -0
  189. package/dist/types/core.d.ts +40 -0
  190. package/dist/types/core.d.ts.map +1 -0
  191. package/dist/types/data/academic.d.ts +6 -0
  192. package/dist/types/data/academic.d.ts.map +1 -0
  193. package/dist/types/data/events.d.ts +21 -0
  194. package/dist/types/data/events.d.ts.map +1 -0
  195. package/dist/types/data/experts.d.ts +53 -0
  196. package/dist/types/data/experts.d.ts.map +1 -0
  197. package/dist/types/data/index.d.ts +5 -0
  198. package/dist/types/data/index.d.ts.map +1 -0
  199. package/dist/types/data/news.d.ts +6 -0
  200. package/dist/types/data/news.d.ts.map +1 -0
  201. package/dist/types/feeds.d.ts +35 -0
  202. package/dist/types/feeds.d.ts.map +1 -0
  203. package/dist/types/index.d.ts +5 -0
  204. package/dist/types/index.d.ts.map +1 -0
  205. package/dist/widgets/index.d.ts +2 -0
  206. package/dist/widgets/index.d.ts.map +1 -0
  207. package/dist/{macros → widgets}/slider.d.ts +1 -2
  208. package/dist/widgets/slider.d.ts.map +1 -0
  209. package/dist/{macros/slider.mjs → widgets/slider.js} +10 -10
  210. package/dist/widgets/slider.js.map +1 -0
  211. package/package.json +18 -12
  212. package/dist/academic.mjs +0 -5
  213. package/dist/academic.mjs.map +0 -1
  214. package/dist/composite/academic/_types.d.ts.map +0 -1
  215. package/dist/composite/academic/index.d.ts +0 -2
  216. package/dist/composite/academic/index.d.ts.map +0 -1
  217. package/dist/composite/academic/slider.d.ts +0 -5
  218. package/dist/composite/academic/slider.d.ts.map +0 -1
  219. package/dist/composite/academic/slider.js +0 -36
  220. package/dist/composite/academic/slider.js.map +0 -1
  221. package/dist/composite/academic/slider.mjs +0 -37
  222. package/dist/composite/academic/slider.mjs.map +0 -1
  223. package/dist/composite/events/_types.d.ts.map +0 -1
  224. package/dist/composite/events/common/data.d.ts +0 -44
  225. package/dist/composite/events/common/data.d.ts.map +0 -1
  226. package/dist/composite/events/common/data.js +0 -54
  227. package/dist/composite/events/common/data.js.map +0 -1
  228. package/dist/composite/events/common/data.mjs +0 -54
  229. package/dist/composite/events/common/data.mjs.map +0 -1
  230. package/dist/composite/events/common/display.d.ts +0 -18
  231. package/dist/composite/events/common/display.d.ts.map +0 -1
  232. package/dist/composite/events/common/display.js +0 -147
  233. package/dist/composite/events/common/display.js.map +0 -1
  234. package/dist/composite/events/common/display.mjs +0 -130
  235. package/dist/composite/events/common/display.mjs.map +0 -1
  236. package/dist/composite/events/common/fetch.d.ts +0 -24
  237. package/dist/composite/events/common/fetch.d.ts.map +0 -1
  238. package/dist/composite/events/common/fetch.js +0 -119
  239. package/dist/composite/events/common/fetch.js.map +0 -1
  240. package/dist/composite/events/common/fetch.mjs +0 -119
  241. package/dist/composite/events/common/fetch.mjs.map +0 -1
  242. package/dist/composite/events/common/queries.d.ts +0 -5
  243. package/dist/composite/events/common/queries.d.ts.map +0 -1
  244. package/dist/composite/events/common/queries.js +0 -113
  245. package/dist/composite/events/common/queries.js.map +0 -1
  246. package/dist/composite/events/common/queries.mjs +0 -113
  247. package/dist/composite/events/common/queries.mjs.map +0 -1
  248. package/dist/composite/events/grid.d.ts +0 -5
  249. package/dist/composite/events/grid.d.ts.map +0 -1
  250. package/dist/composite/events/grid.js +0 -92
  251. package/dist/composite/events/grid.js.map +0 -1
  252. package/dist/composite/events/grid.mjs +0 -93
  253. package/dist/composite/events/grid.mjs.map +0 -1
  254. package/dist/composite/events/grouped.d.ts +0 -5
  255. package/dist/composite/events/grouped.d.ts.map +0 -1
  256. package/dist/composite/events/grouped.js +0 -290
  257. package/dist/composite/events/grouped.js.map +0 -1
  258. package/dist/composite/events/grouped.mjs +0 -274
  259. package/dist/composite/events/grouped.mjs.map +0 -1
  260. package/dist/composite/events/index.d.ts +0 -5
  261. package/dist/composite/events/index.d.ts.map +0 -1
  262. package/dist/composite/events/list.d.ts +0 -5
  263. package/dist/composite/events/list.d.ts.map +0 -1
  264. package/dist/composite/events/list.js +0 -92
  265. package/dist/composite/events/list.js.map +0 -1
  266. package/dist/composite/events/list.mjs +0 -93
  267. package/dist/composite/events/list.mjs.map +0 -1
  268. package/dist/composite/events/slider.d.ts +0 -5
  269. package/dist/composite/events/slider.d.ts.map +0 -1
  270. package/dist/composite/events/slider.js +0 -37
  271. package/dist/composite/events/slider.js.map +0 -1
  272. package/dist/composite/events/slider.mjs +0 -38
  273. package/dist/composite/events/slider.mjs.map +0 -1
  274. package/dist/composite/news/_types.d.ts.map +0 -1
  275. package/dist/composite/news/common/data.d.ts +0 -47
  276. package/dist/composite/news/common/data.d.ts.map +0 -1
  277. package/dist/composite/news/common/data.js +0 -63
  278. package/dist/composite/news/common/data.js.map +0 -1
  279. package/dist/composite/news/common/data.mjs +0 -63
  280. package/dist/composite/news/common/data.mjs.map +0 -1
  281. package/dist/composite/news/common/display.d.ts +0 -17
  282. package/dist/composite/news/common/display.d.ts.map +0 -1
  283. package/dist/composite/news/common/display.js +0 -147
  284. package/dist/composite/news/common/display.js.map +0 -1
  285. package/dist/composite/news/common/display.mjs +0 -130
  286. package/dist/composite/news/common/display.mjs.map +0 -1
  287. package/dist/composite/news/common/fetch.d.ts +0 -22
  288. package/dist/composite/news/common/fetch.d.ts.map +0 -1
  289. package/dist/composite/news/common/fetch.js +0 -89
  290. package/dist/composite/news/common/fetch.js.map +0 -1
  291. package/dist/composite/news/common/fetch.mjs +0 -89
  292. package/dist/composite/news/common/fetch.mjs.map +0 -1
  293. package/dist/composite/news/common/queries.d.ts +0 -2
  294. package/dist/composite/news/common/queries.d.ts.map +0 -1
  295. package/dist/composite/news/common/queries.js +0 -37
  296. package/dist/composite/news/common/queries.js.map +0 -1
  297. package/dist/composite/news/common/queries.mjs +0 -37
  298. package/dist/composite/news/common/queries.mjs.map +0 -1
  299. package/dist/composite/news/featured.d.ts +0 -5
  300. package/dist/composite/news/featured.d.ts.map +0 -1
  301. package/dist/composite/news/featured.js +0 -184
  302. package/dist/composite/news/featured.js.map +0 -1
  303. package/dist/composite/news/featured.mjs +0 -185
  304. package/dist/composite/news/featured.mjs.map +0 -1
  305. package/dist/composite/news/grid.d.ts +0 -5
  306. package/dist/composite/news/grid.d.ts.map +0 -1
  307. package/dist/composite/news/grid.js +0 -100
  308. package/dist/composite/news/grid.js.map +0 -1
  309. package/dist/composite/news/grid.mjs +0 -101
  310. package/dist/composite/news/grid.mjs.map +0 -1
  311. package/dist/composite/news/index.d.ts +0 -4
  312. package/dist/composite/news/index.d.ts.map +0 -1
  313. package/dist/composite/news/list.d.ts +0 -5
  314. package/dist/composite/news/list.d.ts.map +0 -1
  315. package/dist/composite/news/list.js +0 -87
  316. package/dist/composite/news/list.js.map +0 -1
  317. package/dist/composite/news/list.mjs +0 -88
  318. package/dist/composite/news/list.mjs.map +0 -1
  319. package/dist/elements/asset.d.ts +0 -10
  320. package/dist/elements/asset.d.ts.map +0 -1
  321. package/dist/elements/asset.js +0 -27
  322. package/dist/elements/asset.js.map +0 -1
  323. package/dist/elements/asset.mjs +0 -27
  324. package/dist/elements/asset.mjs.map +0 -1
  325. package/dist/elements/index.d.ts +0 -4
  326. package/dist/elements/index.d.ts.map +0 -1
  327. package/dist/elements/layout.d.ts +0 -15
  328. package/dist/elements/layout.d.ts.map +0 -1
  329. package/dist/elements/layout.js +0 -113
  330. package/dist/elements/layout.js.map +0 -1
  331. package/dist/elements/layout.mjs +0 -96
  332. package/dist/elements/layout.mjs.map +0 -1
  333. package/dist/elements/text.d.ts +0 -12
  334. package/dist/elements/text.d.ts.map +0 -1
  335. package/dist/elements/text.js +0 -41
  336. package/dist/elements/text.js.map +0 -1
  337. package/dist/elements/text.mjs +0 -41
  338. package/dist/elements/text.mjs.map +0 -1
  339. package/dist/events.mjs +0 -11
  340. package/dist/events.mjs.map +0 -1
  341. package/dist/index.mjs +0 -9
  342. package/dist/index.mjs.map +0 -1
  343. package/dist/macros/aria-live.d.ts +0 -11
  344. package/dist/macros/aria-live.d.ts.map +0 -1
  345. package/dist/macros/aria-live.js +0 -25
  346. package/dist/macros/aria-live.js.map +0 -1
  347. package/dist/macros/aria-live.mjs +0 -26
  348. package/dist/macros/aria-live.mjs.map +0 -1
  349. package/dist/macros/index.d.ts +0 -6
  350. package/dist/macros/index.d.ts.map +0 -1
  351. package/dist/macros/lazy-load.d.ts +0 -16
  352. package/dist/macros/lazy-load.d.ts.map +0 -1
  353. package/dist/macros/lazy-load.js +0 -54
  354. package/dist/macros/lazy-load.js.map +0 -1
  355. package/dist/macros/lazy-load.mjs +0 -38
  356. package/dist/macros/lazy-load.mjs.map +0 -1
  357. package/dist/macros/loader.d.ts +0 -15
  358. package/dist/macros/loader.d.ts.map +0 -1
  359. package/dist/macros/loader.js +0 -128
  360. package/dist/macros/loader.js.map +0 -1
  361. package/dist/macros/loader.mjs.map +0 -1
  362. package/dist/macros/no-results.d.ts +0 -12
  363. package/dist/macros/no-results.d.ts.map +0 -1
  364. package/dist/macros/no-results.js +0 -66
  365. package/dist/macros/no-results.js.map +0 -1
  366. package/dist/macros/no-results.mjs +0 -50
  367. package/dist/macros/no-results.mjs.map +0 -1
  368. package/dist/macros/slider.d.ts.map +0 -1
  369. package/dist/macros/slider.js +0 -103
  370. package/dist/macros/slider.js.map +0 -1
  371. package/dist/macros/slider.mjs.map +0 -1
  372. package/dist/news.mjs +0 -9
  373. package/dist/news.mjs.map +0 -1
  374. package/dist/utilities/events/index.d.ts.map +0 -1
  375. package/dist/utilities/events/index.js +0 -19
  376. package/dist/utilities/events/index.js.map +0 -1
  377. package/dist/utilities/events/index.mjs.map +0 -1
  378. package/dist/utilities/index.d.ts +0 -3
  379. package/dist/utilities/index.d.ts.map +0 -1
  380. package/dist/utilities/network/fetch.d.ts.map +0 -1
  381. package/dist/utilities/network/index.d.ts.map +0 -1
  382. /package/dist/{composite → feeds}/academic/_types.d.ts +0 -0
  383. /package/dist/{composite → feeds}/events/_types.d.ts +0 -0
  384. /package/dist/{composite → feeds}/news/_types.d.ts +0 -0
  385. /package/dist/{utilities → helpers}/network/fetch.d.ts +0 -0
  386. /package/dist/{utilities → helpers}/network/index.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experts.js","sources":["../../../source/strategies/display/experts.ts"],"sourcesContent":["/**\n * Experts Display Strategy\n *\n * Strategy for displaying expert entries using person or card elements.\n * Uses a functional composition approach with pure data extraction,\n * element creation, and card composition functions.\n *\n * @module strategies/display/experts\n */\n\nimport {\n person,\n card,\n} from '@universityofmaryland/web-elements-library/composite';\nimport {\n createTextWithLink,\n createTextContainer,\n createImageOrLinkedImage,\n} from '@universityofmaryland/web-utilities-library/elements';\nimport { DisplayStrategy, CardMappingOptions } from '../../factory/core/types';\nimport { ElementModel } from '../../_types';\nimport { ExpertEntry } from 'types/data';\n\n// ============================================================================\n// TYPE DEFINITIONS\n// ============================================================================\n\n/**\n * Contact field configuration\n */\ninterface ContactConfig {\n key: keyof Pick<ExpertEntry, 'email' | 'website' | 'linkedin' | 'twitter'>;\n label: (value: string) => string;\n url: (value: string) => string;\n}\n\n/**\n * Extracted association data\n */\ninterface AssociationData {\n title: string;\n url?: string | null;\n}\n\n/**\n * Extracted image data\n */\ninterface ImageData {\n url: string;\n altText: string;\n}\n\n/**\n * Extracted contact data\n */\ninterface ContactData {\n email?: string | null;\n website?: string | null;\n linkedin?: string | null;\n twitter?: string | null;\n}\n\n// ============================================================================\n// CONSTANTS\n// ============================================================================\n\n/**\n * Contact field configuration\n *\n * Defines how each contact type should be rendered as a link.\n */\nconst CONTACT_CONFIGS: ContactConfig[] = [\n {\n key: 'email',\n label: () => 'Email',\n url: (value) => `mailto:${value}`,\n },\n {\n key: 'website',\n label: (value) => value,\n url: (value) => value,\n },\n {\n key: 'linkedin',\n label: (value) => value,\n url: (value) => value,\n },\n {\n key: 'twitter',\n label: (value) => value,\n url: (value) => value,\n },\n];\n\n// ============================================================================\n// PURE DATA EXTRACTION FUNCTIONS\n// ============================================================================\n\n/**\n * Build full name from expert entry\n *\n * Combines prefix (optional), first, middle (optional), last name, and suffix (optional).\n *\n * @param entry - Expert entry\n * @returns Full name string\n */\nexport const buildFullName = (entry: ExpertEntry): string => {\n const parts = [\n entry.prefix,\n entry.firstName,\n entry.middleName,\n entry.lastName,\n entry.suffix,\n ].filter(Boolean);\n\n return parts.join(' ');\n};\n\n/**\n * Build expert profile URL\n *\n * @param entry - Expert entry\n * @returns Profile URL string\n */\nconst buildProfileUrl = (entry: ExpertEntry): string => {\n return `https://umdrightnow.umd.edu/expert/${entry.slug}`;\n};\n\n/**\n * Extract primary job title\n *\n * @param entry - Expert entry\n * @returns Job title string or null\n */\nconst extractPrimaryJobTitle = (entry: ExpertEntry): string | null => {\n return entry.organizations?.[0]?.jobs?.[0]?.title || null;\n};\n\n/**\n * Extract primary association (campus unit)\n *\n * @param entry - Expert entry\n * @returns Association data or null\n */\nconst extractPrimaryAssociation = (\n entry: ExpertEntry,\n): AssociationData | null => {\n const campusUnit = entry.organizations?.[0]?.jobs?.[0]?.campusUnits?.[0];\n if (!campusUnit) return null;\n\n return {\n title: campusUnit.title,\n url: campusUnit.link?.url,\n };\n};\n\n/**\n * Extract image data from headshot\n *\n * @param entry - Expert entry\n * @param fullName - Full name for alt text\n * @returns Image data or null\n */\nconst extractImageData = (\n entry: ExpertEntry,\n fullName: string,\n): ImageData | null => {\n const headshotUrl = entry.headshot?.[0]?.url;\n if (!headshotUrl) return null;\n\n return {\n url: headshotUrl,\n altText: fullName,\n };\n};\n\n/**\n * Extract contact data\n *\n * @param entry - Expert entry\n * @returns Contact data object\n */\nconst extractContactData = (entry: ExpertEntry): ContactData => {\n return {\n email: entry.email || null,\n website: entry.website || null,\n linkedin: entry.linkedin || null,\n twitter: entry.twitter || null,\n };\n};\n\n/**\n * Extract description based on display type\n *\n * @param entry - Expert entry\n * @param displayType - 'small' for summary, 'full' for biography\n * @returns HTML description string or null\n */\nconst extractDescription = (\n entry: ExpertEntry,\n displayType: 'small' | 'full',\n): string | null => {\n if (displayType === 'full') {\n return entry.bio?.html || null;\n }\n return entry.summary?.html || null;\n};\n\n/**\n * Extract pronouns\n *\n * @param entry - Expert entry\n * @returns Pronouns string or null\n */\nconst extractPronouns = (entry: ExpertEntry): string | null => {\n return entry.pronouns || null;\n};\n\n// ============================================================================\n// ELEMENT CREATION FUNCTIONS\n// ============================================================================\n\n/**\n * Create name element with link\n *\n * @param fullName - Full name text\n * @param url - Profile URL\n * @param containerTag - HTML tag for container (default: undefined)\n * @returns Name element or null\n */\nconst createNameElement = (\n fullName: string,\n url: string,\n containerTag?: 'h1' | 'h2' | 'h3',\n): HTMLElement | null => {\n return createTextWithLink({\n text: fullName,\n url,\n containerTag,\n });\n};\n\n/**\n * Create job title element\n *\n * @param jobTitle - Job title text\n * @returns Job element or null\n */\nconst createJobElement = (jobTitle: string | null): HTMLElement | null => {\n if (!jobTitle) return null;\n return createTextContainer({ text: jobTitle });\n};\n\n/**\n * Create association element (with optional link)\n *\n * @param association - Association data\n * @returns Association element or null\n */\nconst createAssociationElement = (\n association: AssociationData | null,\n): HTMLElement | null => {\n if (!association) return null;\n\n if (association.url) {\n return createTextWithLink({\n text: association.title,\n url: association.url,\n });\n }\n\n return createTextContainer({ text: association.title });\n};\n\n/**\n * Create image element (with optional link)\n *\n * @param imageData - Image data\n * @param linkUrl - Optional link URL\n * @param linkLabel - Optional link label\n * @returns Image element or null\n */\nconst createImageElement = (\n imageData: ImageData | null,\n linkUrl?: string,\n linkLabel?: string,\n): HTMLImageElement | HTMLAnchorElement | null => {\n if (!imageData) return null;\n\n return createImageOrLinkedImage({\n imageUrl: imageData.url,\n altText: imageData.altText,\n linkUrl,\n linkLabel,\n });\n};\n\n/**\n * Create description element\n *\n * @param description - HTML description text\n * @returns Description element or null\n */\nconst createDescriptionElement = (\n description: string | null,\n): HTMLElement | null => {\n if (!description) return null;\n return createTextContainer({ text: description, allowHTML: true });\n};\n\n/**\n * Create pronouns element\n *\n * @param pronouns - Pronouns text\n * @returns Pronouns element or null\n */\nconst createPronounsElement = (pronouns: string | null): HTMLElement | null => {\n if (!pronouns) return null;\n return createTextContainer({ text: pronouns });\n};\n\n/**\n * Create contact elements from contact data\n *\n * @param contactData - Contact data object\n * @returns Object with contact elements keyed by contact type\n */\nconst createContactElements = (\n contactData: ContactData,\n): { [key: string]: HTMLElement | null } => {\n return CONTACT_CONFIGS.reduce<{ [key: string]: HTMLElement | null }>(\n (elements, config) => {\n const value = contactData[config.key];\n if (!value) return elements;\n\n const element = createTextWithLink({\n text: config.label(value),\n url: config.url(value),\n });\n\n elements[config.key] = element;\n return elements;\n },\n {},\n );\n};\n\n// ============================================================================\n// CARD COMPOSITION FUNCTIONS\n// ============================================================================\n\n/**\n * Create props for person block card\n *\n * @param entry - Expert entry\n * @param options - Card mapping options\n * @returns Person block card element\n */\nconst createBlockCardProps = (\n entry: ExpertEntry,\n options: CardMappingOptions,\n): ElementModel => {\n const { isThemeDark = false } = options;\n\n // Extract data\n const fullName = buildFullName(entry);\n const profileUrl = buildProfileUrl(entry);\n const jobTitle = extractPrimaryJobTitle(entry);\n const association = extractPrimaryAssociation(entry);\n const imageData = extractImageData(entry, fullName);\n const pronouns = extractPronouns(entry);\n\n // Create elements\n const name = createNameElement(fullName, profileUrl);\n const job = createJobElement(jobTitle);\n const associationElement = createAssociationElement(association);\n const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);\n const pronounsElement = createPronounsElement(pronouns);\n\n return person.block({\n name,\n pronouns: pronounsElement,\n job,\n association: associationElement,\n image,\n isThemeDark,\n });\n};\n\n/**\n * Create props for person list card\n *\n * @param entry - Expert entry\n * @param options - Card mapping options\n * @returns Person list card element\n */\nconst createListCardProps = (\n entry: ExpertEntry,\n options: CardMappingOptions,\n): ElementModel => {\n const { isThemeDark = false } = options;\n\n // Extract data\n const fullName = buildFullName(entry);\n const profileUrl = buildProfileUrl(entry);\n const jobTitle = extractPrimaryJobTitle(entry);\n const association = extractPrimaryAssociation(entry);\n const imageData = extractImageData(entry, fullName);\n const pronouns = extractPronouns(entry);\n\n // Create elements\n const name = createNameElement(fullName, profileUrl);\n const job = createJobElement(jobTitle);\n const associationElement = createAssociationElement(association);\n const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);\n const pronounsElement = createPronounsElement(pronouns);\n\n return person.list({\n name,\n pronouns: pronounsElement,\n job,\n association: associationElement,\n image,\n isThemeDark,\n });\n};\n\n/**\n * Create props for person tabular card\n *\n * @param entry - Expert entry\n * @param options - Card mapping options\n * @returns Person tabular card element\n */\nconst createTabularCardProps = (\n entry: ExpertEntry,\n options: CardMappingOptions,\n): ElementModel => {\n const { isThemeDark = false } = options;\n\n // Extract data\n const fullName = buildFullName(entry);\n const profileUrl = buildProfileUrl(entry);\n const jobTitle = extractPrimaryJobTitle(entry);\n const association = extractPrimaryAssociation(entry);\n const imageData = extractImageData(entry, fullName);\n const contactData = extractContactData(entry);\n const pronouns = extractPronouns(entry);\n\n // Create elements\n const name = createNameElement(fullName, profileUrl);\n const job = createJobElement(jobTitle);\n const associationElement = createAssociationElement(association);\n const image = createImageElement(imageData, profileUrl, `View profile for ${fullName}`);\n const contactElements = createContactElements(contactData);\n const pronounsElement = createPronounsElement(pronouns);\n\n return person.tabular({\n name,\n pronouns: pronounsElement,\n job,\n association: associationElement,\n image,\n ...contactElements,\n isThemeDark,\n });\n};\n\n/**\n * Create props for overlay card\n *\n * @param entry - Expert entry\n * @param options - Card mapping options\n * @returns Overlay card element\n */\nconst createOverlayCardProps = (\n entry: ExpertEntry,\n options: CardMappingOptions,\n): ElementModel => {\n const { isThemeDark = false } = options;\n\n // Extract data\n const fullName = buildFullName(entry);\n const profileUrl = buildProfileUrl(entry);\n const jobTitle = extractPrimaryJobTitle(entry);\n const imageData = extractImageData(entry, fullName);\n\n // Create elements\n const headline = createNameElement(fullName, profileUrl);\n const text = createJobElement(jobTitle);\n const backgroundImage = createImageElement(\n imageData,\n profileUrl,\n `View profile for ${fullName}`,\n );\n\n return card.overlay.image({\n headline,\n text,\n backgroundImage,\n isThemeDark,\n });\n};\n\n/**\n * Map expert entry to PersonBio props\n *\n * Shared helper for creating PersonBio props from expert data.\n * Used by both the display strategy and bio feed for consistency.\n *\n * @param entry - Expert entry from API\n * @param displayType - 'small' for summary, 'full' for biography\n * @param isThemeDark - Dark theme flag\n * @returns Props for person.bio.full() or person.bio.small()\n *\n * @example\n * ```typescript\n * const bioProps = mapExpertToBioProps(expert, 'full', false);\n * const bioElement = person.bio.full(bioProps);\n * ```\n */\nexport const mapExpertToBioProps = (\n entry: ExpertEntry,\n displayType: 'small' | 'full',\n isThemeDark: boolean = false,\n) => {\n // Extract data\n const fullName = buildFullName(entry);\n const profileUrl = buildProfileUrl(entry);\n const jobTitle = extractPrimaryJobTitle(entry);\n const association = extractPrimaryAssociation(entry);\n const imageData = extractImageData(entry, fullName);\n const contactData = extractContactData(entry);\n const description = extractDescription(entry, displayType);\n const pronouns = extractPronouns(entry);\n\n // Create elements\n const name = createNameElement(fullName, profileUrl, 'h1');\n const job = createJobElement(jobTitle);\n const associationElement = createAssociationElement(association);\n const image = createImageElement(imageData); // No link for bio display\n const descriptionElement = createDescriptionElement(description);\n const contactElements = createContactElements(contactData);\n const pronounsElement = createPronounsElement(pronouns);\n\n return {\n name,\n pronouns: pronounsElement,\n job,\n association: associationElement,\n email: contactElements.email || null,\n linkedin: contactElements.linkedin || null,\n phone: null,\n address: null,\n additionalContact: null,\n image,\n description: descriptionElement,\n isThemeDark,\n };\n};\n\n// ============================================================================\n// DISPLAY STRATEGY\n// ============================================================================\n\n/**\n * Experts display strategy\n *\n * Maps expert entries to person elements for profile display.\n * Optimized for displaying faculty and expert profiles with contact\n * information and skills.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * displayStrategy: expertsDisplayStrategy,\n * // ...\n * });\n * ```\n */\nexport const expertsDisplayStrategy: DisplayStrategy<ExpertEntry> = {\n layoutType: 'list',\n\n mapEntryToCard: (\n entry: ExpertEntry,\n options: CardMappingOptions,\n ): ElementModel => {\n const { isOverlay = false, cardType = 'block' } = options;\n\n // Handle overlay card type (requires headshot)\n if (isOverlay && entry.headshot?.[0]?.url) {\n return createOverlayCardProps(entry, options);\n }\n\n // Route to appropriate card type\n switch (cardType) {\n case 'list':\n return createListCardProps(entry, options);\n case 'tabular':\n return createTabularCardProps(entry, options);\n default:\n return createBlockCardProps(entry, options);\n }\n },\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export { eventsDisplayStrategy } from './events';
2
+ export { newsDisplayStrategy } from './news';
3
+ export { expertsDisplayStrategy } from './experts';
4
+ export type { EventEntry, NewsEntry, ExpertEntry } from '../../types/data';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../source/strategies/display/index.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { DisplayStrategy } from '../../factory/core/types';
2
+ import { NewsEntry } from '../../types/data';
3
+ export declare const newsDisplayStrategy: DisplayStrategy<NewsEntry>;
4
+ //# sourceMappingURL=news.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news.d.ts","sourceRoot":"","sources":["../../../source/strategies/display/news.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,eAAe,EAAsB,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAqBvC,eAAO,MAAM,mBAAmB,EAAE,eAAe,CAAC,SAAS,CAyE1D,CAAC"}
@@ -0,0 +1,58 @@
1
+ import { card } from "@universityofmaryland/web-elements-library/composite";
2
+ import { createTextWithLink, createTextContainer, createTimeElement, createImageOrLinkedImage } from "@universityofmaryland/web-utilities-library/elements";
3
+ const newsDisplayStrategy = {
4
+ layoutType: "grid",
5
+ mapEntryToCard: (entry, options) => {
6
+ const {
7
+ isThemeDark = false,
8
+ isTransparent = false,
9
+ isAligned = true,
10
+ imageConfig,
11
+ isOverlay = false,
12
+ cardType = "block"
13
+ } = options;
14
+ const headline = createTextWithLink({
15
+ text: entry.title,
16
+ url: entry.url
17
+ });
18
+ const text = createTextContainer({
19
+ text: entry.summary
20
+ });
21
+ const date = createTimeElement({
22
+ datetime: entry.date,
23
+ displayText: entry.dateFormatted
24
+ });
25
+ const commonProps = {
26
+ newsId: entry.id.toString(),
27
+ headline,
28
+ text,
29
+ date,
30
+ isThemeDark
31
+ };
32
+ if (isOverlay && imageConfig) {
33
+ const backgroundImage = createImageOrLinkedImage(imageConfig(entry));
34
+ return card.overlay.image({
35
+ ...commonProps,
36
+ backgroundImage
37
+ });
38
+ }
39
+ const image = imageConfig ? createImageOrLinkedImage(imageConfig(entry)) : void 0;
40
+ if (cardType === "list") {
41
+ return card.list({
42
+ ...commonProps,
43
+ image,
44
+ isAligned: false
45
+ });
46
+ }
47
+ return card.block({
48
+ ...commonProps,
49
+ image,
50
+ isAligned,
51
+ isTransparent
52
+ });
53
+ }
54
+ };
55
+ export {
56
+ newsDisplayStrategy
57
+ };
58
+ //# sourceMappingURL=news.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"news.js","sources":["../../../source/strategies/display/news.ts"],"sourcesContent":["/**\n * News Display Strategy\n *\n * Strategy for displaying news article entries as cards.\n * Maps news data to card elements with date information.\n *\n * @module strategies/display/news\n */\n\nimport { card } from '@universityofmaryland/web-elements-library/composite';\nimport {\n createTextWithLink,\n createTextContainer,\n createTimeElement,\n createImageOrLinkedImage,\n} from '@universityofmaryland/web-utilities-library/elements';\nimport { DisplayStrategy, CardMappingOptions } from '../../factory/core/types';\nimport { ElementModel } from '../../_types';\nimport { NewsEntry } from 'types/data';\n\n/**\n * News display strategy\n *\n * Maps news article entries to card elements with date metadata.\n * Supports block, overlay, and list card layouts.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * displayStrategy: newsDisplayStrategy,\n * imageConfig: (entry) => ({\n * imageUrl: entry.image[0].url,\n * altText: entry.image[0].altText || 'News Article Image',\n * linkUrl: entry.url,\n * }),\n * // ...\n * });\n * ```\n */\nexport const newsDisplayStrategy: DisplayStrategy<NewsEntry> = {\n layoutType: 'grid',\n\n mapEntryToCard: (\n entry: NewsEntry,\n options: CardMappingOptions\n ): ElementModel => {\n const {\n isThemeDark = false,\n isTransparent = false,\n isAligned = true,\n imageConfig,\n isOverlay = false,\n cardType = 'block',\n } = options;\n\n // Create headline\n const headline = createTextWithLink({\n text: entry.title,\n url: entry.url,\n });\n\n // Create summary text\n const text = createTextContainer({\n text: entry.summary,\n });\n\n // Create date element\n const date = createTimeElement({\n datetime: entry.date,\n displayText: entry.dateFormatted,\n });\n\n // Common card properties\n const commonProps = {\n newsId: entry.id.toString(),\n headline,\n text,\n date,\n isThemeDark,\n };\n\n // Handle overlay card type\n if (isOverlay && imageConfig) {\n const backgroundImage = createImageOrLinkedImage(imageConfig(entry));\n return card.overlay.image({\n ...commonProps,\n backgroundImage,\n });\n }\n\n // Create image (if imageConfig provided)\n const image = imageConfig\n ? createImageOrLinkedImage(imageConfig(entry))\n : undefined;\n\n // Handle list card type\n if (cardType === 'list') {\n return card.list({\n ...commonProps,\n image,\n isAligned: false,\n });\n }\n\n // Default to block card\n return card.block({\n ...commonProps,\n image,\n isAligned,\n isTransparent,\n });\n },\n};\n"],"names":[],"mappings":";;AAuCO,MAAM,sBAAkD;AAAA,EAC7D,YAAY;AAAA,EAEZ,gBAAgB,CACd,OACA,YACiB;AACjB,UAAM;AAAA,MACJ,cAAc;AAAA,MACd,gBAAgB;AAAA,MAChB,YAAY;AAAA,MACZ;AAAA,MACA,YAAY;AAAA,MACZ,WAAW;AAAA,IAAA,IACT;AAGJ,UAAM,WAAW,mBAAmB;AAAA,MAClC,MAAM,MAAM;AAAA,MACZ,KAAK,MAAM;AAAA,IAAA,CACZ;AAGD,UAAM,OAAO,oBAAoB;AAAA,MAC/B,MAAM,MAAM;AAAA,IAAA,CACb;AAGD,UAAM,OAAO,kBAAkB;AAAA,MAC7B,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,IAAA,CACpB;AAGD,UAAM,cAAc;AAAA,MAClB,QAAQ,MAAM,GAAG,SAAA;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAIF,QAAI,aAAa,aAAa;AAC5B,YAAM,kBAAkB,yBAAyB,YAAY,KAAK,CAAC;AACnE,aAAO,KAAK,QAAQ,MAAM;AAAA,QACxB,GAAG;AAAA,QACH;AAAA,MAAA,CACD;AAAA,IACH;AAGA,UAAM,QAAQ,cACV,yBAAyB,YAAY,KAAK,CAAC,IAC3C;AAGJ,QAAI,aAAa,QAAQ;AACvB,aAAO,KAAK,KAAK;AAAA,QACf,GAAG;AAAA,QACH;AAAA,QACA,WAAW;AAAA,MAAA,CACZ;AAAA,IACH;AAGA,WAAO,KAAK,MAAM;AAAA,MAChB,GAAG;AAAA,MACH;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AACF;"}
@@ -0,0 +1,2 @@
1
+ export declare const ACADEMIC_SLIDER_QUERY = "\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n calendarId: [4, 2]\n ) {\n ...AcademicSliderFields\n }\n }\n }\n \n fragment AcademicSliderFields on CalendarEventInterface {\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n }\n\n";
2
+ //# sourceMappingURL=academic.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"academic.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/academic.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,qBAAqB,soBAejC,CAAC"}
@@ -0,0 +1,30 @@
1
+ const FRAGMENT_ACADEMIC_SLIDER = `
2
+ fragment AcademicSliderFields on CalendarEventInterface {
3
+ title
4
+ url
5
+ startMonth: startDate @formatDateTime(format: "M")
6
+ startDay: startDate @formatDateTime(format: "d")
7
+ endMonth: endDate @formatDateTime(format: "M")
8
+ endDay: endDate @formatDateTime(format: "d")
9
+ }
10
+ `;
11
+ const ACADEMIC_SLIDER_QUERY = `
12
+ query getEvents($startDate: String!, $related: [QueryArgument]) {
13
+ entries: solspace_calendar {
14
+ events(
15
+ relatedTo: $related
16
+ loadOccurrences: true
17
+ startsAfterOrAt: $startDate
18
+ limit: 12
19
+ calendarId: [4, 2]
20
+ ) {
21
+ ...AcademicSliderFields
22
+ }
23
+ }
24
+ }
25
+ ${FRAGMENT_ACADEMIC_SLIDER}
26
+ `;
27
+ export {
28
+ ACADEMIC_SLIDER_QUERY
29
+ };
30
+ //# sourceMappingURL=academic.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"academic.js","sources":["../../../source/strategies/fetch/academic.ts"],"sourcesContent":["/**\n * Academic Fetch Strategy\n *\n * Strategy for fetching academic event data from the UMD Provost GraphQL API.\n *\n * @module strategies/fetch/academic\n */\n\n/**\n * GraphQL fragments for academic event data\n */\nconst FRAGMENT_ACADEMIC_SLIDER = `\n fragment AcademicSliderFields on CalendarEventInterface {\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n }\n`;\n\n/**\n * Slider-specific query for academic events\n * Used by academic slider for carousel displays\n */\nexport const ACADEMIC_SLIDER_QUERY = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n calendarId: [4, 2]\n ) {\n ...AcademicSliderFields\n }\n }\n }\n ${FRAGMENT_ACADEMIC_SLIDER}\n`;\n"],"names":[],"mappings":"AAWA,MAAM,2BAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe1B,MAAM,wBAAwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAcjC,wBAAwB;AAAA;"}
@@ -0,0 +1,20 @@
1
+ import { EventEntry } from '../../types/data';
2
+ export declare const EVENTS_COUNT_QUERY: string;
3
+ export declare const EVENTS_QUERY: string;
4
+ export declare const CATEGORY_NAMES_QUERY = "\n query getCategoryNames($ids: [QueryArgument]!) {\n categories(id: $ids) {\n id\n title\n }\n }\n";
5
+ export declare const EVENTS_SLIDER_QUERY: string;
6
+ declare function fetchCategoryNames(categoryIds: string[], token?: string): Promise<string[] | null>;
7
+ export declare const eventsFetchStrategy: {
8
+ fetchCategoryNames: typeof fetchCategoryNames;
9
+ fetchCount: (variables: any) => Promise<number | null>;
10
+ fetchEntries: (variables: any) => Promise<EventEntry[] | null>;
11
+ composeApiVariables: (props: any) => any;
12
+ };
13
+ export declare const eventsFetchStrategyRange: {
14
+ fetchCategoryNames: typeof fetchCategoryNames;
15
+ fetchCount: (variables: any) => Promise<number | null>;
16
+ fetchEntries: (variables: any) => Promise<EventEntry[] | null>;
17
+ composeApiVariables: (props: any) => any;
18
+ };
19
+ export {};
20
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/events.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA+IxC,eAAO,MAAM,kBAAkB,QAA0B,CAAC;AAC1D,eAAO,MAAM,YAAY,QAAqB,CAAC;AAM/C,eAAO,MAAM,oBAAoB,0HAOhC,CAAC;AAMF,eAAO,MAAM,mBAAmB,QAc/B,CAAC;AAqDF,iBAAe,kBAAkB,CAC/B,WAAW,EAAE,MAAM,EAAE,EACrB,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAkB1B;AAED,eAAO,MAAM,mBAAmB;;;;;CAG/B,CAAC;AAyCF,eAAO,MAAM,wBAAwB;;;;;CAGpC,CAAC"}
@@ -0,0 +1,223 @@
1
+ import { createGraphQLFetchStrategy } from "./graphql.js";
2
+ import { fetchGraphQL } from "@universityofmaryland/web-utilities-library/network";
3
+ const CALENDARS = ["communications", "submission"];
4
+ function generateFragments() {
5
+ return CALENDARS.map(
6
+ (cal) => `
7
+ fragment EventBasicFields_${cal} on ${cal}_Event {
8
+ id
9
+ title
10
+ url
11
+ }
12
+
13
+ fragment EventDateFields_${cal} on ${cal}_Event {
14
+ startDayOfWeek: startDate @formatDateTime(format: "D")
15
+ startMonth: startDate @formatDateTime(format: "M")
16
+ startDay: startDate @formatDateTime(format: "d")
17
+ startStamp: startDate @formatDateTime(format: "Y-m-d")
18
+ startTime: startDate @formatDateTime(format: "g:ia")
19
+ endDayOfWeek: endDate @formatDateTime(format: "D")
20
+ endMonth: endDate @formatDateTime(format: "M")
21
+ endDay: endDate @formatDateTime(format: "d")
22
+ endTime: endDate @formatDateTime(format: "g:ia")
23
+ allDay
24
+ }
25
+
26
+ fragment EventContentFields_${cal} on ${cal}_Event {
27
+ summary: commonRichTextTwo
28
+ image: commonAssetHeroImageSingle {
29
+ url
30
+ altText: commonPlainTextTwo
31
+ }
32
+ location: categoriesCampusBuildingSingle {
33
+ title
34
+ }
35
+ }
36
+
37
+ fragment EventCategoryFields_${cal} on ${cal}_Event {
38
+ categories: categoriesEventAudienceMultiple {
39
+ id
40
+ title
41
+ }
42
+ }
43
+ `
44
+ ).join("\n");
45
+ }
46
+ function generateInlineSpreads() {
47
+ return CALENDARS.map(
48
+ (cal) => `
49
+ ... on ${cal}_Event {
50
+ ...EventBasicFields_${cal}
51
+ ...EventDateFields_${cal}
52
+ ...EventContentFields_${cal}
53
+ ...EventCategoryFields_${cal}
54
+ }
55
+ `
56
+ ).join("\n");
57
+ }
58
+ function generateSliderSpreads() {
59
+ return CALENDARS.map(
60
+ (cal) => `
61
+ ... on ${cal}_Event {
62
+ ...EventSliderFields_${cal}
63
+ }
64
+ `
65
+ ).join("\n");
66
+ }
67
+ function generateSliderFragments() {
68
+ return CALENDARS.map(
69
+ (cal) => `
70
+ fragment EventSliderFields_${cal} on ${cal}_Event {
71
+ title
72
+ url
73
+ startMonth: startDate @formatDateTime(format: "M")
74
+ startDay: startDate @formatDateTime(format: "d")
75
+ endMonth: endDate @formatDateTime(format: "M")
76
+ endDay: endDate @formatDateTime(format: "d")
77
+ }
78
+ `
79
+ ).join("\n");
80
+ }
81
+ const buildEventsCountQuery = (dateFilter = "startsAfterOrAt") => `
82
+ query getEventsCount($startDate: String!, $related: [QueryArgument]) {
83
+ count: solspace_calendar {
84
+ events(relatedTo: $related, loadOccurrences: true, ${dateFilter}: $startDate) {
85
+ ... on communications_Event {
86
+ id
87
+ }
88
+ ... on submission_Event {
89
+ id
90
+ }
91
+ }
92
+ }
93
+ }
94
+ `;
95
+ const buildEventsQuery = (dateFilter = "startsAfterOrAt") => `
96
+ query getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {
97
+ entries: solspace_calendar {
98
+ events(
99
+ relatedTo: $related
100
+ loadOccurrences: true
101
+ ${dateFilter}: $startDate
102
+ limit: $limit
103
+ offset: $offset
104
+ ) {
105
+ ${generateInlineSpreads()}
106
+ }
107
+ }
108
+ }
109
+ ${generateFragments()}
110
+ `;
111
+ const EVENTS_COUNT_QUERY = buildEventsCountQuery();
112
+ const EVENTS_QUERY = buildEventsQuery();
113
+ const CATEGORY_NAMES_QUERY = `
114
+ query getCategoryNames($ids: [QueryArgument]!) {
115
+ categories(id: $ids) {
116
+ id
117
+ title
118
+ }
119
+ }
120
+ `;
121
+ const EVENTS_SLIDER_QUERY = `
122
+ query getEvents($startDate: String!, $related: [QueryArgument]) {
123
+ entries: solspace_calendar {
124
+ events(
125
+ relatedTo: $related
126
+ loadOccurrences: true
127
+ startsAfterOrAt: $startDate
128
+ limit: 12
129
+ ) {
130
+ ${generateSliderSpreads()}
131
+ }
132
+ }
133
+ }
134
+ ${generateSliderFragments()}
135
+ `;
136
+ const baseFetchStrategy = createGraphQLFetchStrategy({
137
+ endpoint: "https://calendar.umd.edu/graphql",
138
+ queries: {
139
+ entries: EVENTS_QUERY,
140
+ count: EVENTS_COUNT_QUERY
141
+ },
142
+ transformResponse: (data) => {
143
+ if (!data || !data.data || !data.data.entries) {
144
+ return null;
145
+ }
146
+ return data.data.entries.events || null;
147
+ },
148
+ transformCount: (data) => {
149
+ if (!data || !data.data || !data.data.count) {
150
+ return 0;
151
+ }
152
+ return data.data.count.events?.length || 0;
153
+ },
154
+ composeVariables: (baseVariables) => {
155
+ const { categories, ...rest } = baseVariables;
156
+ return {
157
+ ...rest,
158
+ related: categories,
159
+ startDate: (/* @__PURE__ */ new Date()).toDateString()
160
+ };
161
+ }
162
+ });
163
+ async function fetchCategoryNames(categoryIds, token) {
164
+ try {
165
+ const response = await fetchGraphQL({
166
+ url: "https://calendar.umd.edu/graphql",
167
+ query: CATEGORY_NAMES_QUERY,
168
+ token: token || "",
169
+ variables: { ids: categoryIds }
170
+ });
171
+ if (!response || !response.data || !response.data.categories) {
172
+ return null;
173
+ }
174
+ return response.data.categories.map((category) => category.title);
175
+ } catch (error) {
176
+ console.error("Fetch category names error:", error);
177
+ return null;
178
+ }
179
+ }
180
+ const eventsFetchStrategy = {
181
+ ...baseFetchStrategy,
182
+ fetchCategoryNames
183
+ };
184
+ const baseFetchStrategyRange = createGraphQLFetchStrategy({
185
+ endpoint: "https://calendar.umd.edu/graphql",
186
+ queries: {
187
+ entries: buildEventsQuery("rangeStart"),
188
+ count: buildEventsCountQuery("rangeStart")
189
+ },
190
+ transformResponse: (data) => {
191
+ if (!data || !data.data || !data.data.entries) {
192
+ return null;
193
+ }
194
+ return data.data.entries.events || null;
195
+ },
196
+ transformCount: (data) => {
197
+ if (!data || !data.data || !data.data.count) {
198
+ return 0;
199
+ }
200
+ return data.data.count.events?.length || 0;
201
+ },
202
+ composeVariables: (baseVariables) => {
203
+ const { categories, ...rest } = baseVariables;
204
+ return {
205
+ ...rest,
206
+ related: categories,
207
+ startDate: (/* @__PURE__ */ new Date()).toDateString()
208
+ };
209
+ }
210
+ });
211
+ const eventsFetchStrategyRange = {
212
+ ...baseFetchStrategyRange,
213
+ fetchCategoryNames
214
+ };
215
+ export {
216
+ CATEGORY_NAMES_QUERY,
217
+ EVENTS_COUNT_QUERY,
218
+ EVENTS_QUERY,
219
+ EVENTS_SLIDER_QUERY,
220
+ eventsFetchStrategy,
221
+ eventsFetchStrategyRange
222
+ };
223
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sources":["../../../source/strategies/fetch/events.ts"],"sourcesContent":["/**\n * Events Fetch Strategy\n *\n * Strategy for fetching event data from the UMD Calendar GraphQL API.\n *\n * @module strategies/fetch/events\n */\n\nimport { createGraphQLFetchStrategy } from './graphql';\nimport { EventEntry } from 'types/data';\nimport { fetchGraphQL } from '@universityofmaryland/web-utilities-library/network';\n\n/**\n * Calendar types available in the UMD Calendar system\n */\nconst CALENDARS = ['communications', 'submission'] as const;\n\n/**\n * Generate GraphQL fragments for all calendar types\n * Creates type-specific fragments to avoid interface limitations\n */\nfunction generateFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventBasicFields_${cal} on ${cal}_Event {\n id\n title\n url\n }\n\n fragment EventDateFields_${cal} on ${cal}_Event {\n startDayOfWeek: startDate @formatDateTime(format: \"D\")\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n startStamp: startDate @formatDateTime(format: \"Y-m-d\")\n startTime: startDate @formatDateTime(format: \"g:ia\")\n endDayOfWeek: endDate @formatDateTime(format: \"D\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n endTime: endDate @formatDateTime(format: \"g:ia\")\n allDay\n }\n\n fragment EventContentFields_${cal} on ${cal}_Event {\n summary: commonRichTextTwo\n image: commonAssetHeroImageSingle {\n url\n altText: commonPlainTextTwo\n }\n location: categoriesCampusBuildingSingle {\n title\n }\n }\n\n fragment EventCategoryFields_${cal} on ${cal}_Event {\n categories: categoriesEventAudienceMultiple {\n id\n title\n }\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for all calendar types\n * Used in the main query to apply fragments to each calendar type\n */\nfunction generateInlineSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventBasicFields_${cal}\n ...EventDateFields_${cal}\n ...EventContentFields_${cal}\n ...EventCategoryFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate inline fragment spreads for slider queries\n * Minimal fields for carousel displays\n */\nfunction generateSliderSpreads() {\n return CALENDARS.map(\n (cal) => `\n ... on ${cal}_Event {\n ...EventSliderFields_${cal}\n }\n `,\n ).join('\\n');\n}\n\n/**\n * Generate slider-specific fragments\n */\nfunction generateSliderFragments() {\n return CALENDARS.map(\n (cal) => `\n fragment EventSliderFields_${cal} on ${cal}_Event {\n title\n url\n startMonth: startDate @formatDateTime(format: \"M\")\n startDay: startDate @formatDateTime(format: \"d\")\n endMonth: endDate @formatDateTime(format: \"M\")\n endDay: endDate @formatDateTime(format: \"d\")\n }\n `,\n ).join('\\n');\n}\n\n/**\n * GraphQL queries for events\n */\nconst buildEventsCountQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEventsCount($startDate: String!, $related: [QueryArgument]) {\n count: solspace_calendar {\n events(relatedTo: $related, loadOccurrences: true, ${dateFilter}: $startDate) {\n ... on communications_Event {\n id\n }\n ... on submission_Event {\n id\n }\n }\n }\n }\n`;\n\nconst buildEventsQuery = (\n dateFilter: 'startsAfterOrAt' | 'rangeStart' = 'startsAfterOrAt',\n) => `\n query getEvents($startDate: String!, $related: [QueryArgument], $limit: Int, $offset: Int) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n ${dateFilter}: $startDate\n limit: $limit\n offset: $offset\n ) {\n ${generateInlineSpreads()}\n }\n }\n }\n ${generateFragments()}\n`;\n\nexport const EVENTS_COUNT_QUERY = buildEventsCountQuery();\nexport const EVENTS_QUERY = buildEventsQuery();\n\n/**\n * Query for fetching category names by IDs\n * Queries the categories table directly\n */\nexport const CATEGORY_NAMES_QUERY = `\n query getCategoryNames($ids: [QueryArgument]!) {\n categories(id: $ids) {\n id\n title\n }\n }\n`;\n\n/**\n * Slider-specific query with minimal fields\n * Used by events slider for carousel displays\n */\nexport const EVENTS_SLIDER_QUERY = `\n query getEvents($startDate: String!, $related: [QueryArgument]) {\n entries: solspace_calendar {\n events(\n relatedTo: $related\n loadOccurrences: true\n startsAfterOrAt: $startDate\n limit: 12\n ) {\n ${generateSliderSpreads()}\n }\n }\n }\n ${generateSliderFragments()}\n`;\n\n/**\n * Events fetch strategy\n *\n * Fetches event data from the UMD Calendar GraphQL API.\n * Handles date filtering, category filtering, and pagination.\n *\n * @example\n * ```typescript\n * const feed = createBaseFeed({\n * token: 'my-token',\n * fetchStrategy: eventsFetchStrategy,\n * // ...\n * });\n * ```\n */\nconst baseFetchStrategy = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: EVENTS_QUERY,\n count: EVENTS_COUNT_QUERY,\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\n/**\n * Fetch category names by their IDs\n */\nasync function fetchCategoryNames(\n categoryIds: string[],\n token?: string,\n): Promise<string[] | null> {\n try {\n const response = await fetchGraphQL({\n url: 'https://calendar.umd.edu/graphql',\n query: CATEGORY_NAMES_QUERY,\n token: token || '',\n variables: { ids: categoryIds },\n });\n\n if (!response || !response.data || !response.data.categories) {\n return null;\n }\n\n return response.data.categories.map((category: any) => category.title);\n } catch (error) {\n console.error('Fetch category names error:', error);\n return null;\n }\n}\n\nexport const eventsFetchStrategy = {\n ...baseFetchStrategy,\n fetchCategoryNames,\n};\n\n/**\n * Events fetch strategy for range queries\n *\n * Uses rangeStart filter instead of startsAfterOrAt.\n * Used for grouped event displays.\n */\nconst baseFetchStrategyRange = createGraphQLFetchStrategy<EventEntry>({\n endpoint: 'https://calendar.umd.edu/graphql',\n\n queries: {\n entries: buildEventsQuery('rangeStart'),\n count: buildEventsCountQuery('rangeStart'),\n },\n\n transformResponse: (data) => {\n if (!data || !data.data || !data.data.entries) {\n return null;\n }\n return data.data.entries.events || null;\n },\n\n transformCount: (data) => {\n if (!data || !data.data || !data.data.count) {\n return 0;\n }\n return data.data.count.events?.length || 0;\n },\n\n composeVariables: (baseVariables) => {\n const { categories, ...rest } = baseVariables;\n\n return {\n ...rest,\n related: categories,\n startDate: new Date().toDateString(),\n };\n },\n});\n\nexport const eventsFetchStrategyRange = {\n ...baseFetchStrategyRange,\n fetchCategoryNames,\n};\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { ExpertEntry } from '../../types/data';
2
+ export declare const EXPERTS_QUERY = "\n query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument], $isMediaTrained:Boolean) {\n entryCount(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n )\n entries(\n section: \"experts\"\n limit: $limit\n offset: $offset\n type: \"expertsContent\"\n id: $id\n relatedTo: $relatedTo\n expertsMediaTrained: $isMediaTrained\n orderBy: \"expertsNameLast\"\n ) {\n ...EntriesNativeFields\n ... on expertsContent_Entry {\n ...Content\n ...Categories\n }\n }\n }\n \n fragment EntriesNativeFields on EntryInterface {\n id\n uid\n status\n enabled\n slug\n title\n type: typeHandle\n postDate\n expiryDate\n dateUpdated\n dateCreated\n }\n\n \n fragment CategoryFields on CategoryInterface {\n title\n url\n id\n }\n\n \n fragment Content on expertsContent_Entry {\n ...Name\n ...Imagery\n ...Biography\n organizations: expertsOrganization {\n ...Organizations\n }\n ...Contact\n ...Skills\n }\n\n \n fragment Categories on expertsContent_Entry {\n areasOfExpertise: expertsCategoryAreaOfExpertise {\n ...CategoryFields\n }\n campusUnits: categoryCampusUnit {\n ...CategoryFields\n }\n tags: expertsCategoryTags {\n ...CategoryFields\n }\n }\n\n \n fragment Name on expertsContent_Entry {\n prefix: expertsNamePrefix\n firstName: expertsNameFirst\n middleName: expertsNameMiddle\n lastName: expertsNameLast\n suffix: expertsNameSuffix\n pronouns: expertsNamePronouns\n }\n\n \n fragment Imagery on expertsContent_Entry {\n headshot: expertsImageHeadShot {\n ... on experts_Asset {\n url\n }\n }\n }\n\n \n fragment Biography on expertsContent_Entry {\n summary: expertsSummary {\n html\n }\n bio: expertsBiography {\n html\n }\n }\n\n \n fragment Organizations on expertsOrganization_Entry {\n id\n title\n url\n jobs: expertsOrganizationJob {\n ...Jobs\n }\n }\n\n \n fragment Jobs on expertsOrganizationJob_Entry {\n id\n url\n title: expertsOrganizationJobTitle\n roomNumber: expertsOrganizationJobRoomNumber\n campusUnits: categoryCampusUnit {\n title\n ... on campusUnits_Category {\n link: externalLink {\n url\n }\n }\n }\n }\n\n \n fragment Contact on expertsContent_Entry {\n email: expertsContactEmail\n linkedin: expertsContactLinkedin\n website: expertsContactWebsite\n twitter: expertsContactTwitter\n }\n\n \n fragment Skills on expertsContent_Entry {\n languages: expertsLanguages\n mediaTrained: expertsMediaTrained\n }\n\n";
3
+ export declare const expertsFetchStrategy: import('../../factory').FetchStrategy<ExpertEntry, any>;
4
+ //# sourceMappingURL=experts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"experts.d.ts","sourceRoot":"","sources":["../../../source/strategies/fetch/experts.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAwIzC,eAAO,MAAM,aAAa,s1FAuCzB,CAAC;AAmBF,eAAO,MAAM,oBAAoB,yDA0C/B,CAAC"}
@@ -0,0 +1,194 @@
1
+ import { createGraphQLFetchStrategy } from "./graphql.js";
2
+ const FRAGMENT_CATEGORIES_NATIVE_FIELDS = `
3
+ fragment CategoryFields on CategoryInterface {
4
+ title
5
+ url
6
+ id
7
+ }
8
+ `;
9
+ const FRAGMENT_ENTRIES_NATIVE_FIELDS = `
10
+ fragment EntriesNativeFields on EntryInterface {
11
+ id
12
+ uid
13
+ status
14
+ enabled
15
+ slug
16
+ title
17
+ type: typeHandle
18
+ postDate
19
+ expiryDate
20
+ dateUpdated
21
+ dateCreated
22
+ }
23
+ `;
24
+ const FRAGMENT_EXPERT_JOBS = `
25
+ fragment Jobs on expertsOrganizationJob_Entry {
26
+ id
27
+ url
28
+ title: expertsOrganizationJobTitle
29
+ roomNumber: expertsOrganizationJobRoomNumber
30
+ campusUnits: categoryCampusUnit {
31
+ title
32
+ ... on campusUnits_Category {
33
+ link: externalLink {
34
+ url
35
+ }
36
+ }
37
+ }
38
+ }
39
+ `;
40
+ const FRAGMENT_EXPERT_NAME = `
41
+ fragment Name on expertsContent_Entry {
42
+ prefix: expertsNamePrefix
43
+ firstName: expertsNameFirst
44
+ middleName: expertsNameMiddle
45
+ lastName: expertsNameLast
46
+ suffix: expertsNameSuffix
47
+ pronouns: expertsNamePronouns
48
+ }
49
+ `;
50
+ const FRAGMENT_EXPERT_IMAGERY = `
51
+ fragment Imagery on expertsContent_Entry {
52
+ headshot: expertsImageHeadShot {
53
+ ... on experts_Asset {
54
+ url
55
+ }
56
+ }
57
+ }
58
+ `;
59
+ const FRAGMENT_EXPERT_BIOGRAPHY = `
60
+ fragment Biography on expertsContent_Entry {
61
+ summary: expertsSummary {
62
+ html
63
+ }
64
+ bio: expertsBiography {
65
+ html
66
+ }
67
+ }
68
+ `;
69
+ const FRAGMENT_ENTRIES_ORGANIZATIONS = `
70
+ fragment Organizations on expertsOrganization_Entry {
71
+ id
72
+ title
73
+ url
74
+ jobs: expertsOrganizationJob {
75
+ ...Jobs
76
+ }
77
+ }
78
+ `;
79
+ const FRAGMENT_EXPERT_CONTACT = `
80
+ fragment Contact on expertsContent_Entry {
81
+ email: expertsContactEmail
82
+ linkedin: expertsContactLinkedin
83
+ website: expertsContactWebsite
84
+ twitter: expertsContactTwitter
85
+ }
86
+ `;
87
+ const FRAGMENT_EXPERT_SKILLS = `
88
+ fragment Skills on expertsContent_Entry {
89
+ languages: expertsLanguages
90
+ mediaTrained: expertsMediaTrained
91
+ }
92
+ `;
93
+ const FRAGMENT_EXPERT_CONTENT = `
94
+ fragment Content on expertsContent_Entry {
95
+ ...Name
96
+ ...Imagery
97
+ ...Biography
98
+ organizations: expertsOrganization {
99
+ ...Organizations
100
+ }
101
+ ...Contact
102
+ ...Skills
103
+ }
104
+ `;
105
+ const FRAGMENT_EXPERT_CATEGORIES = `
106
+ fragment Categories on expertsContent_Entry {
107
+ areasOfExpertise: expertsCategoryAreaOfExpertise {
108
+ ...CategoryFields
109
+ }
110
+ campusUnits: categoryCampusUnit {
111
+ ...CategoryFields
112
+ }
113
+ tags: expertsCategoryTags {
114
+ ...CategoryFields
115
+ }
116
+ }
117
+ `;
118
+ const EXPERTS_QUERY = `
119
+ query getExpertsContent($limit: Int, $offset: Int, $id: [QueryArgument], $relatedTo: [QueryArgument], $isMediaTrained:Boolean) {
120
+ entryCount(
121
+ section: "experts"
122
+ limit: $limit
123
+ offset: $offset
124
+ type: "expertsContent"
125
+ id: $id
126
+ relatedTo: $relatedTo
127
+ expertsMediaTrained: $isMediaTrained
128
+ )
129
+ entries(
130
+ section: "experts"
131
+ limit: $limit
132
+ offset: $offset
133
+ type: "expertsContent"
134
+ id: $id
135
+ relatedTo: $relatedTo
136
+ expertsMediaTrained: $isMediaTrained
137
+ orderBy: "expertsNameLast"
138
+ ) {
139
+ ...EntriesNativeFields
140
+ ... on expertsContent_Entry {
141
+ ...Content
142
+ ...Categories
143
+ }
144
+ }
145
+ }
146
+ ${FRAGMENT_ENTRIES_NATIVE_FIELDS}
147
+ ${FRAGMENT_CATEGORIES_NATIVE_FIELDS}
148
+ ${FRAGMENT_EXPERT_CONTENT}
149
+ ${FRAGMENT_EXPERT_CATEGORIES}
150
+ ${FRAGMENT_EXPERT_NAME}
151
+ ${FRAGMENT_EXPERT_IMAGERY}
152
+ ${FRAGMENT_EXPERT_BIOGRAPHY}
153
+ ${FRAGMENT_ENTRIES_ORGANIZATIONS}
154
+ ${FRAGMENT_EXPERT_JOBS}
155
+ ${FRAGMENT_EXPERT_CONTACT}
156
+ ${FRAGMENT_EXPERT_SKILLS}
157
+ `;
158
+ const expertsFetchStrategy = createGraphQLFetchStrategy({
159
+ endpoint: "https://umd-api.production.servd.dev/graphql",
160
+ queries: {
161
+ entries: EXPERTS_QUERY
162
+ },
163
+ transformResponse: (data) => {
164
+ if (!data || !data.data || !data.data.entries) {
165
+ return null;
166
+ }
167
+ return data.data.entries || null;
168
+ },
169
+ transformCount: (data) => {
170
+ if (!data || !data.data) {
171
+ return 0;
172
+ }
173
+ return data.data.entryCount || 0;
174
+ },
175
+ composeVariables: (baseVariables) => {
176
+ const { categories, entriesToRemove, id, isMediaTrained, ...rest } = baseVariables;
177
+ const variables = { ...rest };
178
+ if (id) {
179
+ variables.id = Array.isArray(id) ? id : [id];
180
+ }
181
+ if (categories) {
182
+ variables.relatedTo = categories;
183
+ }
184
+ if (isMediaTrained) {
185
+ variables.isMediaTrained = isMediaTrained;
186
+ }
187
+ return variables;
188
+ }
189
+ });
190
+ export {
191
+ EXPERTS_QUERY,
192
+ expertsFetchStrategy
193
+ };
194
+ //# sourceMappingURL=experts.js.map