@studyportals/fawkes 8.7.0 → 8.7.1-0

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 (520) hide show
  1. package/dist/organisations-seo/index.d.ts +3 -3
  2. package/dist/organisations-seo/index.js +1 -1
  3. package/dist/programmes-seo/index.d.ts +5 -5
  4. package/dist/programmes-seo/index.js +1 -1
  5. package/dist/scholarships-seo/index.d.ts +4 -4
  6. package/dist/scholarships-seo/index.js +2 -2
  7. package/dist/sitemap-generator-seo/index.d.ts +14 -14
  8. package/dist/sitemap-generator-seo/index.js +5 -5
  9. package/dist/src/common/IDependencies.d.ts +1 -1
  10. package/dist/src/common/IPresenter.d.ts +1 -1
  11. package/dist/src/common/ISearchDependencies.d.ts +1 -1
  12. package/dist/src/common/ISeoDependencies.d.ts +2 -2
  13. package/dist/src/common/ISitemapDependencies.d.ts +2 -2
  14. package/dist/src/common/ISitemapUrlGenerator.d.ts +1 -1
  15. package/dist/src/common/policies/BaseSeoIndexabilityPolicy.d.ts +1 -1
  16. package/dist/src/common/policies/BaseSeoIndexabilityPolicy.js +2 -2
  17. package/dist/src/common/rules/NoFiltersSelectedRule.d.ts +2 -2
  18. package/dist/src/common/rules/OnlineAttendanceRule.d.ts +1 -1
  19. package/dist/src/common/rules/OnlineAttendanceRule.js +1 -1
  20. package/dist/src/common/rules/OnlyFiltersSelectedRule.d.ts +2 -2
  21. package/dist/src/common/rules/SingleValueSelectedForFilterRule.d.ts +2 -2
  22. package/dist/src/organisations/IOrganisationSearchApplicationState.d.ts +1 -1
  23. package/dist/src/organisations/ISeoSortingState.d.ts +1 -1
  24. package/dist/src/organisations/SearchIndexabilityManager.d.ts +4 -4
  25. package/dist/src/organisations/SearchIndexabilityManager.js +2 -2
  26. package/dist/src/organisations/policies/OrganisationsSeoIndexabilityPolicy.d.ts +3 -3
  27. package/dist/src/organisations/policies/OrganisationsSeoIndexabilityPolicy.js +3 -3
  28. package/dist/src/organisations/policies/RankedOrganisationsSeoIndexabilityPolicy.d.ts +1 -1
  29. package/dist/src/organisations/policies/RankedOrganisationsSeoIndexabilityPolicy.js +1 -1
  30. package/dist/src/organisations/policies/our-picks/Area.d.ts +5 -5
  31. package/dist/src/organisations/policies/our-picks/Area.js +6 -6
  32. package/dist/src/organisations/policies/our-picks/AreaAttendance.d.ts +7 -7
  33. package/dist/src/organisations/policies/our-picks/AreaAttendance.js +9 -9
  34. package/dist/src/organisations/policies/our-picks/Attendance.d.ts +6 -6
  35. package/dist/src/organisations/policies/our-picks/Attendance.js +7 -7
  36. package/dist/src/organisations/policies/our-picks/Continent.d.ts +5 -5
  37. package/dist/src/organisations/policies/our-picks/Continent.js +6 -6
  38. package/dist/src/organisations/policies/our-picks/Country.d.ts +5 -5
  39. package/dist/src/organisations/policies/our-picks/Country.js +6 -6
  40. package/dist/src/organisations/policies/our-picks/CountryAreaCity.d.ts +6 -6
  41. package/dist/src/organisations/policies/our-picks/CountryAreaCity.js +7 -7
  42. package/dist/src/organisations/policies/our-picks/CountryAttendance.d.ts +7 -7
  43. package/dist/src/organisations/policies/our-picks/CountryAttendance.js +9 -9
  44. package/dist/src/organisations/policies/our-picks/CountryCity.d.ts +6 -6
  45. package/dist/src/organisations/policies/our-picks/CountryCity.js +7 -7
  46. package/dist/src/organisations/policies/our-picks/Unfiltered.d.ts +4 -4
  47. package/dist/src/organisations/policies/our-picks/Unfiltered.js +4 -4
  48. package/dist/src/organisations/policies/ranked/RankedArea.d.ts +4 -4
  49. package/dist/src/organisations/policies/ranked/RankedArea.js +4 -4
  50. package/dist/src/organisations/policies/ranked/RankedAreaDiscipline.d.ts +5 -5
  51. package/dist/src/organisations/policies/ranked/RankedAreaDiscipline.js +6 -6
  52. package/dist/src/organisations/policies/ranked/RankedAttendance.d.ts +5 -5
  53. package/dist/src/organisations/policies/ranked/RankedAttendance.js +5 -5
  54. package/dist/src/organisations/policies/ranked/RankedAttendanceDiscipline.d.ts +5 -5
  55. package/dist/src/organisations/policies/ranked/RankedAttendanceDiscipline.js +6 -6
  56. package/dist/src/organisations/policies/ranked/RankedContinent.d.ts +4 -4
  57. package/dist/src/organisations/policies/ranked/RankedContinent.js +4 -4
  58. package/dist/src/organisations/policies/ranked/RankedContinentAttendance.d.ts +6 -6
  59. package/dist/src/organisations/policies/ranked/RankedContinentAttendance.js +7 -7
  60. package/dist/src/organisations/policies/ranked/RankedCountry.d.ts +4 -4
  61. package/dist/src/organisations/policies/ranked/RankedCountry.js +4 -4
  62. package/dist/src/organisations/policies/ranked/RankedCountryAttendance.d.ts +5 -5
  63. package/dist/src/organisations/policies/ranked/RankedCountryAttendance.js +6 -6
  64. package/dist/src/organisations/policies/ranked/RankedCountryDiscipline.d.ts +4 -4
  65. package/dist/src/organisations/policies/ranked/RankedCountryDiscipline.js +5 -5
  66. package/dist/src/organisations/policies/ranked/RankedDiscipline.d.ts +4 -4
  67. package/dist/src/organisations/policies/ranked/RankedDiscipline.js +4 -4
  68. package/dist/src/organisations/policies/ranked/RankedUnfiltered.d.ts +3 -3
  69. package/dist/src/organisations/policies/ranked/RankedUnfiltered.js +2 -2
  70. package/dist/src/organisations/rules/BaseSearchVolumeOrganisationsRule.d.ts +3 -3
  71. package/dist/src/organisations/rules/ContinentIsEuropeRule.d.ts +1 -1
  72. package/dist/src/organisations/rules/ContinentIsEuropeRule.js +1 -1
  73. package/dist/src/organisations/rules/ExcludeByIdForCitiesRule.d.ts +3 -3
  74. package/dist/src/organisations/rules/MinimumAmountOfRankedResultsRule.d.ts +3 -3
  75. package/dist/src/organisations/rules/MinimumAmountOfRankedResultsRule.js +1 -1
  76. package/dist/src/organisations/rules/MinimumAmountOfResultsRule.d.ts +4 -4
  77. package/dist/src/organisations/rules/MinimumAmountOfResultsRule.js +1 -1
  78. package/dist/src/organisations/rules/NoFiltersSelectedRule.d.ts +2 -2
  79. package/dist/src/organisations/types/IOrganisationSearchDependencies.d.ts +2 -2
  80. package/dist/src/organisations/types/IOrganisationsSitemapDependencies.d.ts +3 -3
  81. package/dist/src/presenters/AreaPresenter.d.ts +1 -1
  82. package/dist/src/presenters/AttendancePresenter.d.ts +1 -1
  83. package/dist/src/presenters/CityPresenter.d.ts +1 -1
  84. package/dist/src/presenters/ContinentPresenter.d.ts +1 -1
  85. package/dist/src/presenters/CountryPresenter.d.ts +1 -1
  86. package/dist/src/presenters/DegreePresenter.d.ts +1 -1
  87. package/dist/src/presenters/DisciplinePresenter.d.ts +1 -1
  88. package/dist/src/presenters/DurationPresenter.d.ts +1 -1
  89. package/dist/src/presenters/EducationalFormPresenter.d.ts +1 -1
  90. package/dist/src/presenters/FormatPresenter.d.ts +1 -1
  91. package/dist/src/presenters/SpecialProgrammesPresenter.d.ts +1 -1
  92. package/dist/src/presenters/TuitionFeePresenter.d.ts +1 -1
  93. package/dist/src/programmes/BaseProgrammeFilterKeyValueRule.d.ts +2 -2
  94. package/dist/src/programmes/BaseProgrammeFilterKeyValueRule.js +1 -1
  95. package/dist/src/programmes/BaseProgrammeRule.d.ts +2 -2
  96. package/dist/src/programmes/IProgrammeRule.d.ts +2 -2
  97. package/dist/src/programmes/ProgrammesBaseIndexabilityPolicy.d.ts +3 -3
  98. package/dist/src/programmes/ProgrammesBaseIndexabilityPolicy.js +1 -1
  99. package/dist/src/programmes/SearchIndexabilityManager.d.ts +4 -4
  100. package/dist/src/programmes/SearchIndexabilityManager.js +8 -4
  101. package/dist/src/programmes/policies/Area.d.ts +3 -3
  102. package/dist/src/programmes/policies/Area.js +4 -4
  103. package/dist/src/programmes/policies/Attendance.d.ts +4 -4
  104. package/dist/src/programmes/policies/Attendance.js +5 -5
  105. package/dist/src/programmes/policies/AttendanceArea.d.ts +4 -4
  106. package/dist/src/programmes/policies/AttendanceArea.js +6 -6
  107. package/dist/src/programmes/policies/AttendanceContinent.d.ts +4 -4
  108. package/dist/src/programmes/policies/AttendanceContinent.js +6 -6
  109. package/dist/src/programmes/policies/AttendanceDegree.d.ts +2 -2
  110. package/dist/src/programmes/policies/AttendanceDegree.js +5 -5
  111. package/dist/src/programmes/policies/AttendanceDuration.d.ts +5 -5
  112. package/dist/src/programmes/policies/AttendanceDuration.js +7 -7
  113. package/dist/src/programmes/policies/AttendanceFormat.d.ts +4 -4
  114. package/dist/src/programmes/policies/AttendanceFormat.js +6 -6
  115. package/dist/src/programmes/policies/Continent.d.ts +3 -3
  116. package/dist/src/programmes/policies/Continent.js +4 -4
  117. package/dist/src/programmes/policies/ContinentDuration.d.ts +3 -3
  118. package/dist/src/programmes/policies/ContinentDuration.js +5 -5
  119. package/dist/src/programmes/policies/ContinentFormat.d.ts +3 -3
  120. package/dist/src/programmes/policies/ContinentFormat.js +5 -5
  121. package/dist/src/programmes/policies/ContinentSpecialProgrammes.d.ts +4 -4
  122. package/dist/src/programmes/policies/ContinentSpecialProgrammes.js +6 -6
  123. package/dist/src/programmes/policies/Country.d.ts +3 -3
  124. package/dist/src/programmes/policies/Country.js +4 -4
  125. package/dist/src/programmes/policies/CountryAttendance.d.ts +4 -4
  126. package/dist/src/programmes/policies/CountryAttendance.js +6 -6
  127. package/dist/src/programmes/policies/CountryAttendanceDegree.d.ts +4 -4
  128. package/dist/src/programmes/policies/CountryAttendanceDegree.js +7 -7
  129. package/dist/src/programmes/policies/CountryDegree.d.ts +2 -2
  130. package/dist/src/programmes/policies/CountryDegree.js +5 -5
  131. package/dist/src/programmes/policies/CountryDuration.d.ts +3 -3
  132. package/dist/src/programmes/policies/CountryDuration.js +5 -5
  133. package/dist/src/programmes/policies/CountryDurationDegree.d.ts +3 -3
  134. package/dist/src/programmes/policies/CountryDurationDegree.js +6 -6
  135. package/dist/src/programmes/policies/CountryEducationalForm.d.ts +2 -2
  136. package/dist/src/programmes/policies/CountryEducationalForm.js +5 -5
  137. package/dist/src/programmes/policies/CountryFormat.d.ts +3 -3
  138. package/dist/src/programmes/policies/CountryFormat.js +5 -5
  139. package/dist/src/programmes/policies/CountrySpecialProgrammes.d.ts +4 -4
  140. package/dist/src/programmes/policies/CountrySpecialProgrammes.js +6 -6
  141. package/dist/src/programmes/policies/Degree.d.ts +3 -3
  142. package/dist/src/programmes/policies/Degree.js +4 -4
  143. package/dist/src/programmes/policies/DegreeArea.d.ts +3 -3
  144. package/dist/src/programmes/policies/DegreeArea.js +5 -5
  145. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.d.ts +4 -4
  146. package/dist/src/programmes/policies/DegreeAttendanceDiscipline.js +7 -7
  147. package/dist/src/programmes/policies/DegreeAttendanceFormat.d.ts +4 -4
  148. package/dist/src/programmes/policies/DegreeAttendanceFormat.js +7 -7
  149. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.d.ts +4 -4
  150. package/dist/src/programmes/policies/DegreeAttendanceSpecialProgrammes.js +7 -7
  151. package/dist/src/programmes/policies/DegreeContinent.d.ts +2 -2
  152. package/dist/src/programmes/policies/DegreeContinent.js +5 -5
  153. package/dist/src/programmes/policies/DegreeCountryAttendance.d.ts +3 -3
  154. package/dist/src/programmes/policies/DegreeCountryAttendance.js +6 -6
  155. package/dist/src/programmes/policies/DegreeCountryDiscipline.d.ts +3 -3
  156. package/dist/src/programmes/policies/DegreeCountryDiscipline.js +6 -6
  157. package/dist/src/programmes/policies/DegreeCountryTuitionFee.d.ts +3 -3
  158. package/dist/src/programmes/policies/DegreeCountryTuitionFee.js +6 -6
  159. package/dist/src/programmes/policies/DegreeDuration.d.ts +2 -2
  160. package/dist/src/programmes/policies/DegreeDuration.js +5 -5
  161. package/dist/src/programmes/policies/DegreeFormat.d.ts +2 -2
  162. package/dist/src/programmes/policies/DegreeFormat.js +5 -5
  163. package/dist/src/programmes/policies/DegreeSpecialProgrammes.d.ts +3 -3
  164. package/dist/src/programmes/policies/DegreeSpecialProgrammes.js +5 -5
  165. package/dist/src/programmes/policies/DegreeTuitionFee.d.ts +3 -3
  166. package/dist/src/programmes/policies/DegreeTuitionFee.js +5 -5
  167. package/dist/src/programmes/policies/{DisciplineTuitionFee.d.ts → DegreeTuitionFeeArea.d.ts} +5 -5
  168. package/dist/src/programmes/policies/{DegreeAreaTuitionFee.js → DegreeTuitionFeeArea.js} +7 -7
  169. package/dist/src/programmes/policies/{DegreeAttendanceTuitionFee.d.ts → DegreeTuitionFeeAttendance.d.ts} +2 -2
  170. package/dist/src/programmes/policies/{DegreeAttendanceTuitionFee.js → DegreeTuitionFeeAttendance.js} +7 -7
  171. package/dist/src/programmes/policies/{DegreeContinentTuitionFee.d.ts → DegreeTuitionFeeContinent.d.ts} +2 -2
  172. package/dist/src/programmes/policies/{DegreeContinentTuitionFee.js → DegreeTuitionFeeContinent.js} +6 -6
  173. package/dist/src/programmes/policies/{DegreeFormatTuitionFee.d.ts → DegreeTuitionFeeFormat.d.ts} +3 -3
  174. package/dist/src/programmes/policies/{DegreeFormatTuitionFee.js → DegreeTuitionFeeFormat.js} +9 -9
  175. package/dist/src/programmes/policies/Discipline.d.ts +3 -3
  176. package/dist/src/programmes/policies/Discipline.js +4 -4
  177. package/dist/src/programmes/policies/DisciplineAttendance.d.ts +4 -4
  178. package/dist/src/programmes/policies/DisciplineAttendance.js +6 -6
  179. package/dist/src/programmes/policies/DisciplineContinent.d.ts +3 -3
  180. package/dist/src/programmes/policies/DisciplineContinent.js +5 -5
  181. package/dist/src/programmes/policies/DisciplineContinentAttendance.d.ts +4 -4
  182. package/dist/src/programmes/policies/DisciplineContinentAttendance.js +7 -7
  183. package/dist/src/programmes/policies/DisciplineCountry.d.ts +3 -3
  184. package/dist/src/programmes/policies/DisciplineCountry.js +5 -5
  185. package/dist/src/programmes/policies/DisciplineCountryAttendance.d.ts +4 -4
  186. package/dist/src/programmes/policies/DisciplineCountryAttendance.js +7 -7
  187. package/dist/src/programmes/policies/DisciplineCountryEducationalForm.d.ts +2 -2
  188. package/dist/src/programmes/policies/DisciplineCountryEducationalForm.js +6 -6
  189. package/dist/src/programmes/policies/DisciplineCountryFormat.d.ts +3 -3
  190. package/dist/src/programmes/policies/DisciplineCountryFormat.js +6 -6
  191. package/dist/src/programmes/policies/DisciplineDegree.d.ts +3 -3
  192. package/dist/src/programmes/policies/DisciplineDegree.js +5 -5
  193. package/dist/src/programmes/policies/DisciplineDuration.d.ts +3 -3
  194. package/dist/src/programmes/policies/DisciplineDuration.js +5 -5
  195. package/dist/src/programmes/policies/DisciplineEducationalForm.d.ts +2 -2
  196. package/dist/src/programmes/policies/DisciplineEducationalForm.js +5 -5
  197. package/dist/src/programmes/policies/DisciplineFormat.d.ts +3 -3
  198. package/dist/src/programmes/policies/DisciplineFormat.js +5 -5
  199. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.d.ts +3 -3
  200. package/dist/src/programmes/policies/DisciplineSpecialProgrammes.js +5 -5
  201. package/dist/src/programmes/policies/Duration.d.ts +3 -3
  202. package/dist/src/programmes/policies/Duration.js +4 -4
  203. package/dist/src/programmes/policies/Format.d.ts +3 -3
  204. package/dist/src/programmes/policies/Format.js +4 -4
  205. package/dist/src/programmes/policies/SpecialProgrammes.d.ts +3 -3
  206. package/dist/src/programmes/policies/SpecialProgrammes.js +4 -4
  207. package/dist/src/programmes/policies/TuitionFee.d.ts +3 -3
  208. package/dist/src/programmes/policies/TuitionFee.js +4 -4
  209. package/dist/src/programmes/policies/TuitionFeeAttendance.d.ts +4 -4
  210. package/dist/src/programmes/policies/TuitionFeeAttendance.js +6 -6
  211. package/dist/src/programmes/policies/TuitionFeeAttendanceDiscipline.d.ts +4 -4
  212. package/dist/src/programmes/policies/TuitionFeeAttendanceDiscipline.js +7 -7
  213. package/dist/src/programmes/policies/TuitionFeeContinent.d.ts +3 -3
  214. package/dist/src/programmes/policies/TuitionFeeContinent.js +5 -5
  215. package/dist/src/programmes/policies/TuitionFeeCountry.d.ts +3 -3
  216. package/dist/src/programmes/policies/TuitionFeeCountry.js +5 -5
  217. package/dist/src/programmes/policies/TuitionFeeDiscipline.d.ts +3 -3
  218. package/dist/src/programmes/policies/TuitionFeeDiscipline.js +5 -5
  219. package/dist/src/programmes/policies/Unfiltered.d.ts +2 -2
  220. package/dist/src/programmes/policies/Unfiltered.js +2 -2
  221. package/dist/src/programmes/policies/index.d.ts +4 -5
  222. package/dist/src/programmes/policies/index.js +4 -5
  223. package/dist/src/programmes/rules/DegreeAttendanceDisciplineRule.d.ts +2 -2
  224. package/dist/src/programmes/rules/DegreeAttendanceDisciplineSpecificRule.d.ts +2 -2
  225. package/dist/src/programmes/rules/DegreeCountryAttendanceSpecificRule.d.ts +2 -2
  226. package/dist/src/programmes/rules/DegreeCountryDisciplineSpecificRule.d.ts +2 -2
  227. package/dist/src/programmes/rules/DegreeCountryTuitionFeeSpecificRule.d.ts +2 -2
  228. package/dist/src/programmes/rules/DegreeDisciplineRule.d.ts +2 -2
  229. package/dist/src/programmes/rules/IndexableDegreeRule.d.ts +2 -2
  230. package/dist/src/programmes/rules/IndexableDegreeRule.js +1 -1
  231. package/dist/src/programmes/rules/IndexableDurationRule.d.ts +2 -2
  232. package/dist/src/programmes/rules/IndexableDurationRule.js +1 -1
  233. package/dist/src/programmes/rules/IndexableEducationalFormRule.d.ts +2 -2
  234. package/dist/src/programmes/rules/IndexableEducationalFormRule.js +1 -1
  235. package/dist/src/programmes/rules/IndexablePageNumberRule.js +1 -1
  236. package/dist/src/programmes/rules/MbaOrMscDegreeRule.d.ts +2 -2
  237. package/dist/src/programmes/rules/MinimumAmountOfResultsRule.d.ts +3 -3
  238. package/dist/src/programmes/rules/MinimumAmountOfResultsRule.js +1 -1
  239. package/dist/src/programmes/rules/NotDistanceLearningPortalRule.js +1 -1
  240. package/dist/src/programmes/rules/OneYearOnlyRule.d.ts +2 -2
  241. package/dist/src/programmes/types/IProgrammeSearchApplicationState.d.ts +1 -1
  242. package/dist/src/programmes/types/IProgrammeSearchDependencies.d.ts +1 -1
  243. package/dist/src/programmes/types/IProgrammeSearchSitemapDependencies.d.ts +1 -1
  244. package/dist/src/programmes/types/IProgrammeSitemapDependencies.d.ts +2 -2
  245. package/dist/src/programmes/types/IProgrammeSitemapUrlGenerator.d.ts +1 -1
  246. package/dist/src/scholarships/SearchIndexabilityManager.d.ts +5 -5
  247. package/dist/src/scholarships/SearchIndexabilityManager.js +1 -1
  248. package/dist/src/scholarships/policies/Area.d.ts +3 -3
  249. package/dist/src/scholarships/policies/Area.js +4 -4
  250. package/dist/src/scholarships/policies/Country.d.ts +3 -3
  251. package/dist/src/scholarships/policies/Country.js +4 -4
  252. package/dist/src/scholarships/policies/Discipline.d.ts +4 -4
  253. package/dist/src/scholarships/policies/Discipline.js +5 -5
  254. package/dist/src/scholarships/policies/DisciplineCountry.d.ts +3 -3
  255. package/dist/src/scholarships/policies/DisciplineCountry.js +5 -5
  256. package/dist/src/scholarships/policies/ScholarshipSeoIndexabilityPolicy.d.ts +2 -2
  257. package/dist/src/scholarships/policies/ScholarshipSeoIndexabilityPolicy.js +2 -2
  258. package/dist/src/scholarships/policies/Unfiltered.d.ts +2 -2
  259. package/dist/src/scholarships/policies/Unfiltered.js +2 -2
  260. package/dist/src/scholarships/policies/UniversityCountry.d.ts +3 -3
  261. package/dist/src/scholarships/policies/UniversityCountry.js +4 -4
  262. package/dist/src/scholarships/rules/ExceptAustaliaAreasRule.d.ts +3 -3
  263. package/dist/src/scholarships/rules/ExceptAustaliaAreasRule.js +1 -1
  264. package/dist/src/scholarships/rules/SearchVolumeAreasRule.d.ts +3 -3
  265. package/dist/src/scholarships/rules/SearchVolumeCountriesDisciplinesRule.d.ts +3 -3
  266. package/dist/src/scholarships/rules/SearchVolumeCountriesRule.d.ts +3 -3
  267. package/dist/src/scholarships/rules/SearchVolumeDisciplinesRule.d.ts +3 -3
  268. package/dist/src/scholarships/types/IScholarshipSeoDependencies.d.ts +1 -1
  269. package/dist/src/scholarships/types/IScholarshipSitemapDependencies.d.ts +2 -2
  270. package/dist/src/sitemap-generator/BaseSitemapUrlGeneratorManager.d.ts +3 -3
  271. package/dist/src/sitemap-generator/IRankingApiClient.d.ts +1 -1
  272. package/dist/src/sitemap-generator/ISearchApiClient.d.ts +1 -1
  273. package/dist/src/sitemap-generator/ISitemapUrlGeneratorManager.d.ts +3 -3
  274. package/dist/src/sitemap-generator/OrganisationsSitemapUrlGeneratorManager.d.ts +4 -4
  275. package/dist/src/sitemap-generator/OrganisationsSitemapUrlGeneratorManager.js +8 -8
  276. package/dist/src/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.d.ts +3 -3
  277. package/dist/src/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.js +15 -15
  278. package/dist/src/sitemap-generator/ScholarshipsSitemapUrlGeneratorManager.d.ts +3 -3
  279. package/dist/src/sitemap-generator/ScholarshipsSitemapUrlGeneratorManager.js +7 -7
  280. package/dist/src/structured-data/OrganisationStructuredDataFactory.d.ts +1 -1
  281. package/dist/src/structured-data/ProgrammeStructuredDataFactory.d.ts +1 -1
  282. package/dist/tests/common/rules/NoFiltersSelectedRule.test.d.mts +1 -0
  283. package/dist/tests/common/rules/NoFiltersSelectedRule.test.mjs +40 -0
  284. package/dist/tests/common/rules/OnlyFiltersSelectedRule.test.d.mts +1 -0
  285. package/dist/tests/common/rules/OnlyFiltersSelectedRule.test.mjs +70 -0
  286. package/dist/tests/common/rules/SingleValueSelectedForFilterRule.test.d.mts +1 -0
  287. package/dist/tests/common/rules/SingleValueSelectedForFilterRule.test.mjs +54 -0
  288. package/dist/tests/organisations/policies/our-picks/Area.test.d.mts +1 -0
  289. package/dist/tests/organisations/policies/our-picks/Area.test.mjs +125 -0
  290. package/dist/tests/organisations/policies/our-picks/AreaAttendance.test.d.mts +1 -0
  291. package/dist/tests/organisations/policies/our-picks/AreaAttendance.test.mjs +238 -0
  292. package/dist/tests/organisations/policies/our-picks/Attendance.test.d.mts +1 -0
  293. package/dist/tests/organisations/policies/our-picks/Attendance.test.mjs +119 -0
  294. package/dist/tests/organisations/policies/our-picks/Continent.test.d.mts +1 -0
  295. package/dist/tests/organisations/policies/our-picks/Continent.test.mjs +105 -0
  296. package/dist/tests/organisations/policies/our-picks/Country.test.d.mts +1 -0
  297. package/dist/tests/organisations/policies/our-picks/Country.test.mjs +109 -0
  298. package/dist/tests/organisations/policies/our-picks/CountryAreaCity.test.d.mts +1 -0
  299. package/dist/tests/organisations/policies/our-picks/CountryAreaCity.test.mjs +152 -0
  300. package/dist/tests/organisations/policies/our-picks/CountryAttendance.test.d.mts +1 -0
  301. package/dist/tests/organisations/policies/our-picks/CountryAttendance.test.mjs +223 -0
  302. package/dist/tests/organisations/policies/our-picks/CountryCity.test.d.mts +1 -0
  303. package/dist/tests/organisations/policies/our-picks/CountryCity.test.mjs +109 -0
  304. package/dist/tests/organisations/policies/our-picks/Unfiltered.test.d.mts +1 -0
  305. package/dist/tests/organisations/policies/our-picks/Unfiltered.test.mjs +60 -0
  306. package/dist/tests/organisations/policies/ranked/RankedArea.test.d.mts +1 -0
  307. package/dist/tests/organisations/policies/ranked/RankedArea.test.mjs +149 -0
  308. package/dist/tests/organisations/policies/ranked/RankedAreaDiscipline.test.d.mts +1 -0
  309. package/dist/tests/organisations/policies/ranked/RankedAreaDiscipline.test.mjs +237 -0
  310. package/dist/tests/organisations/policies/ranked/RankedAttendance.test.d.mts +1 -0
  311. package/dist/tests/organisations/policies/ranked/RankedAttendance.test.mjs +139 -0
  312. package/dist/tests/organisations/policies/ranked/RankedAttendanceDiscipline.test.d.mts +1 -0
  313. package/dist/tests/organisations/policies/ranked/RankedAttendanceDiscipline.test.mjs +224 -0
  314. package/dist/tests/organisations/policies/ranked/RankedContinent.test.d.mts +1 -0
  315. package/dist/tests/organisations/policies/ranked/RankedContinent.test.mjs +125 -0
  316. package/dist/tests/organisations/policies/ranked/RankedContinentAttendance.test.d.mts +1 -0
  317. package/dist/tests/organisations/policies/ranked/RankedContinentAttendance.test.mjs +253 -0
  318. package/dist/tests/organisations/policies/ranked/RankedCountry.test.d.mts +1 -0
  319. package/dist/tests/organisations/policies/ranked/RankedCountry.test.mjs +131 -0
  320. package/dist/tests/organisations/policies/ranked/RankedCountryAttendance.test.d.mts +1 -0
  321. package/dist/tests/organisations/policies/ranked/RankedCountryAttendance.test.mjs +230 -0
  322. package/dist/tests/organisations/policies/ranked/RankedCountryDiscipline.test.d.mts +1 -0
  323. package/dist/tests/organisations/policies/ranked/RankedCountryDiscipline.test.mjs +197 -0
  324. package/dist/tests/organisations/policies/ranked/RankedDiscipline.test.d.mts +1 -0
  325. package/dist/tests/organisations/policies/ranked/RankedDiscipline.test.mjs +124 -0
  326. package/dist/tests/organisations/policies/ranked/RankedUnfiltered.test.d.mts +1 -0
  327. package/dist/tests/organisations/policies/ranked/RankedUnfiltered.test.mjs +75 -0
  328. package/dist/tests/organisations/rules/ContinentIsEuropeRule.test.d.mts +1 -0
  329. package/dist/tests/organisations/rules/ContinentIsEuropeRule.test.mjs +59 -0
  330. package/dist/tests/organisations/rules/MinimumAmountOfRankedResultsRule.test.d.mts +1 -0
  331. package/dist/tests/organisations/rules/MinimumAmountOfRankedResultsRule.test.mjs +77 -0
  332. package/dist/tests/organisations/rules/MinimumAmountOfResultsRule.test.d.mts +1 -0
  333. package/dist/tests/organisations/rules/MinimumAmountOfResultsRule.test.mjs +77 -0
  334. package/dist/tests/organisations/rules/OnlineAttendanceRule.test.d.mts +1 -0
  335. package/dist/tests/organisations/rules/OnlineAttendanceRule.test.mjs +59 -0
  336. package/dist/tests/organisations/rules/SearchVolumeAreasAttendanceRule.test.d.mts +1 -0
  337. package/dist/tests/organisations/rules/SearchVolumeAreasAttendanceRule.test.mjs +59 -0
  338. package/dist/tests/organisations/rules/SearchVolumeAreasDisciplineRule.test.d.mts +1 -0
  339. package/dist/tests/organisations/rules/SearchVolumeAreasDisciplineRule.test.mjs +59 -0
  340. package/dist/tests/organisations/rules/SearchVolumeCountriesAttendanceRule.test.d.mts +1 -0
  341. package/dist/tests/organisations/rules/SearchVolumeCountriesAttendanceRule.test.mjs +59 -0
  342. package/dist/tests/organisations/utils/SearchDependencies.util.d.mts +20 -0
  343. package/dist/tests/organisations/utils/SearchDependencies.util.mjs +88 -0
  344. package/dist/tests/organisations/utils/SitemapDependencies.util.d.mts +18 -0
  345. package/dist/tests/organisations/utils/SitemapDependencies.util.mjs +54 -0
  346. package/dist/tests/presenters/AreaPresenter.test.d.mts +1 -0
  347. package/dist/tests/presenters/AreaPresenter.test.mjs +46 -0
  348. package/dist/tests/presenters/AttendancePresenter.test.d.mts +1 -0
  349. package/dist/tests/presenters/AttendancePresenter.test.mjs +41 -0
  350. package/dist/tests/presenters/ContinentPresenter.test.d.mts +1 -0
  351. package/dist/tests/presenters/ContinentPresenter.test.mjs +44 -0
  352. package/dist/tests/presenters/CountryPresenter.test.d.mts +1 -0
  353. package/dist/tests/presenters/CountryPresenter.test.mjs +50 -0
  354. package/dist/tests/presenters/DegreePresenter.test.d.mts +1 -0
  355. package/dist/tests/presenters/DegreePresenter.test.mjs +51 -0
  356. package/dist/tests/presenters/DisciplinePresenter.test.d.mts +1 -0
  357. package/dist/tests/presenters/DisciplinePresenter.test.mjs +40 -0
  358. package/dist/tests/presenters/DurationPresenter.test.d.mts +1 -0
  359. package/dist/tests/presenters/DurationPresenter.test.mjs +64 -0
  360. package/dist/tests/presenters/EducationalFormPresenter.test.d.mts +1 -0
  361. package/dist/tests/presenters/EducationalFormPresenter.test.mjs +60 -0
  362. package/dist/tests/presenters/FormatPresenter.test.d.mts +1 -0
  363. package/dist/tests/presenters/FormatPresenter.test.mjs +43 -0
  364. package/dist/tests/presenters/SpecialProgrammesPresenter.test.d.mts +1 -0
  365. package/dist/tests/presenters/SpecialProgrammesPresenter.test.mjs +66 -0
  366. package/dist/tests/presenters/TuitionFeePresenter.test.d.mts +1 -0
  367. package/dist/tests/presenters/TuitionFeePresenter.test.mjs +52 -0
  368. package/dist/tests/programmes/policies/Area.test.d.mts +1 -0
  369. package/dist/tests/programmes/policies/Area.test.mjs +153 -0
  370. package/dist/tests/programmes/policies/Attendance.test.d.mts +1 -0
  371. package/dist/tests/programmes/policies/Attendance.test.mjs +173 -0
  372. package/dist/tests/programmes/policies/AttendanceDegree.test.d.mts +1 -0
  373. package/dist/tests/programmes/policies/AttendanceDegree.test.mjs +291 -0
  374. package/dist/tests/programmes/policies/Continent.test.d.mts +1 -0
  375. package/dist/tests/programmes/policies/Continent.test.mjs +169 -0
  376. package/dist/tests/programmes/policies/Country.test.d.mts +1 -0
  377. package/dist/tests/programmes/policies/Country.test.mjs +164 -0
  378. package/dist/tests/programmes/policies/CountryAttendance.test.d.mts +1 -0
  379. package/dist/tests/programmes/policies/CountryAttendance.test.mjs +251 -0
  380. package/dist/tests/programmes/policies/CountryAttendanceDegree.test.d.mts +1 -0
  381. package/dist/tests/programmes/policies/CountryAttendanceDegree.test.mjs +337 -0
  382. package/dist/tests/programmes/policies/CountryDegree.test.d.mts +1 -0
  383. package/dist/tests/programmes/policies/CountryDegree.test.mjs +262 -0
  384. package/dist/tests/programmes/policies/CountryDuration.test.d.mts +1 -0
  385. package/dist/tests/programmes/policies/CountryDuration.test.mjs +234 -0
  386. package/dist/tests/programmes/policies/CountryDurationDegree.test.d.mts +1 -0
  387. package/dist/tests/programmes/policies/CountryDurationDegree.test.mjs +304 -0
  388. package/dist/tests/programmes/policies/CountryEducationalForm.test.d.mts +1 -0
  389. package/dist/tests/programmes/policies/CountryEducationalForm.test.mjs +260 -0
  390. package/dist/tests/programmes/policies/CountryFormat.test.d.mts +1 -0
  391. package/dist/tests/programmes/policies/CountryFormat.test.mjs +253 -0
  392. package/dist/tests/programmes/policies/DegreeAttendanceDiscipline.test.d.mts +1 -0
  393. package/dist/tests/programmes/policies/DegreeAttendanceDiscipline.test.mjs +179 -0
  394. package/dist/tests/programmes/policies/DegreeCountryAttendance.test.d.mts +1 -0
  395. package/dist/tests/programmes/policies/DegreeCountryAttendance.test.mjs +267 -0
  396. package/dist/tests/programmes/policies/DegreeCountryTuitionFee.test.d.mts +1 -0
  397. package/dist/tests/programmes/policies/DegreeCountryTuitionFee.test.mjs +217 -0
  398. package/dist/tests/programmes/policies/DegreeFormat.test.d.mts +1 -0
  399. package/dist/tests/programmes/policies/DegreeFormat.test.mjs +221 -0
  400. package/dist/tests/programmes/policies/Discipline.test.d.mts +1 -0
  401. package/dist/tests/programmes/policies/Discipline.test.mjs +159 -0
  402. package/dist/tests/programmes/policies/DisciplineAttendance.test.d.mts +1 -0
  403. package/dist/tests/programmes/policies/DisciplineAttendance.test.mjs +292 -0
  404. package/dist/tests/programmes/policies/DisciplineContinent.test.d.mts +1 -0
  405. package/dist/tests/programmes/policies/DisciplineContinent.test.mjs +253 -0
  406. package/dist/tests/programmes/policies/DisciplineCountry.test.d.mts +1 -0
  407. package/dist/tests/programmes/policies/DisciplineCountry.test.mjs +244 -0
  408. package/dist/tests/programmes/policies/DisciplineCountryEducationalForm.test.d.mts +1 -0
  409. package/dist/tests/programmes/policies/DisciplineCountryEducationalForm.test.mjs +345 -0
  410. package/dist/tests/programmes/policies/DisciplineDegree.test.d.mts +1 -0
  411. package/dist/tests/programmes/policies/DisciplineDegree.test.mjs +273 -0
  412. package/dist/tests/programmes/policies/DisciplineDuration.test.d.mts +1 -0
  413. package/dist/tests/programmes/policies/DisciplineDuration.test.mjs +278 -0
  414. package/dist/tests/programmes/policies/DisciplineEducationalForm.test.d.mts +1 -0
  415. package/dist/tests/programmes/policies/DisciplineEducationalForm.test.mjs +302 -0
  416. package/dist/tests/programmes/policies/DisciplineFormat.test.d.mts +1 -0
  417. package/dist/tests/programmes/policies/DisciplineFormat.test.mjs +266 -0
  418. package/dist/tests/programmes/policies/Duration.test.d.mts +1 -0
  419. package/dist/tests/programmes/policies/Duration.test.mjs +179 -0
  420. package/dist/tests/programmes/policies/Format.test.d.mts +1 -0
  421. package/dist/tests/programmes/policies/Format.test.mjs +117 -0
  422. package/dist/tests/programmes/policies/NewRulesValidation.test.d.mts +1 -0
  423. package/dist/tests/programmes/policies/NewRulesValidation.test.mjs +320 -0
  424. package/dist/tests/programmes/policies/SpecialProgrammes.test.d.mts +1 -0
  425. package/dist/tests/programmes/policies/SpecialProgrammes.test.mjs +171 -0
  426. package/dist/tests/programmes/policies/TuitionFeeAttendanceDiscipline.test.d.mts +1 -0
  427. package/dist/tests/programmes/policies/TuitionFeeAttendanceDiscipline.test.mjs +360 -0
  428. package/dist/tests/programmes/policies/TuitionFeeContinent.test.d.mts +1 -0
  429. package/dist/tests/programmes/policies/TuitionFeeContinent.test.mjs +293 -0
  430. package/dist/tests/programmes/policies/TuitionFeeCountry.test.d.mts +1 -0
  431. package/dist/tests/programmes/policies/TuitionFeeCountry.test.mjs +266 -0
  432. package/dist/tests/programmes/policies/TuitionFeeDiscipline.test.d.mts +1 -0
  433. package/dist/tests/programmes/policies/TuitionFeeDiscipline.test.mjs +267 -0
  434. package/dist/tests/programmes/policies/Unfiltered.test.d.mts +1 -0
  435. package/dist/tests/programmes/policies/Unfiltered.test.mjs +90 -0
  436. package/dist/tests/programmes/rules/AffordableTuitionFeeRule.test.d.mts +1 -0
  437. package/dist/tests/programmes/rules/AffordableTuitionFeeRule.test.mjs +27 -0
  438. package/dist/tests/programmes/rules/DegreeCountrySpecificRule.test.d.mts +1 -0
  439. package/dist/tests/programmes/rules/DegreeCountrySpecificRule.test.mjs +121 -0
  440. package/dist/tests/programmes/rules/DegreeDisciplineRule.test.d.mts +1 -0
  441. package/dist/tests/programmes/rules/DegreeDisciplineRule.test.mjs +169 -0
  442. package/dist/tests/programmes/rules/IndexableDegreeRule.test.d.mts +1 -0
  443. package/dist/tests/programmes/rules/IndexableDegreeRule.test.mjs +101 -0
  444. package/dist/tests/programmes/rules/IndexableDurationRule.test..d.mts +1 -0
  445. package/dist/tests/programmes/rules/IndexableDurationRule.test..mjs +25 -0
  446. package/dist/tests/programmes/rules/IndexableEducationalFormRule.test.d.mts +1 -0
  447. package/dist/tests/programmes/rules/IndexableEducationalFormRule.test.mjs +27 -0
  448. package/dist/tests/programmes/rules/IndexablePageNumberRule.test.d.mts +1 -0
  449. package/dist/tests/programmes/rules/IndexablePageNumberRule.test.mjs +51 -0
  450. package/dist/tests/programmes/rules/MbaDegreeRule.test.d.mts +1 -0
  451. package/dist/tests/programmes/rules/MbaDegreeRule.test.mjs +55 -0
  452. package/dist/tests/programmes/rules/MbaOrMscDegreeRule.test.d.mts +1 -0
  453. package/dist/tests/programmes/rules/MbaOrMscDegreeRule.test.mjs +53 -0
  454. package/dist/tests/programmes/rules/MinimumAmountOfResultsRule.test.d.mts +1 -0
  455. package/dist/tests/programmes/rules/MinimumAmountOfResultsRule.test.mjs +79 -0
  456. package/dist/tests/programmes/rules/NotDistanceLearningPortalRule.test.d.mts +1 -0
  457. package/dist/tests/programmes/rules/NotDistanceLearningPortalRule.test.mjs +57 -0
  458. package/dist/tests/programmes/rules/OneYearDurationRule.test..d.mts +1 -0
  459. package/dist/tests/programmes/rules/OneYearDurationRule.test..mjs +40 -0
  460. package/dist/tests/programmes/rules/OnlineAttendanceRule.test.d.mts +1 -0
  461. package/dist/tests/programmes/rules/OnlineAttendanceRule.test.mjs +69 -0
  462. package/dist/tests/programmes/rules/PartTimeFormatRule.test.d.mts +1 -0
  463. package/dist/tests/programmes/rules/PartTimeFormatRule.test.mjs +27 -0
  464. package/dist/tests/programmes/utils/SearchDependencies.util.d.mts +16 -0
  465. package/dist/tests/programmes/utils/SearchDependencies.util.mjs +73 -0
  466. package/dist/tests/programmes/utils/SitemapDependencies.util.d.mts +15 -0
  467. package/dist/tests/programmes/utils/SitemapDependencies.util.mjs +49 -0
  468. package/dist/tests/scholarships/policies/Area.test.d.mts +1 -0
  469. package/dist/tests/scholarships/policies/Area.test.mjs +121 -0
  470. package/dist/tests/scholarships/policies/Country.test.d.mts +1 -0
  471. package/dist/tests/scholarships/policies/Country.test.mjs +97 -0
  472. package/dist/tests/scholarships/policies/Discipline.test.d.mts +1 -0
  473. package/dist/tests/scholarships/policies/Discipline.test.mjs +93 -0
  474. package/dist/tests/scholarships/policies/DisciplineCountry.test.d.mts +1 -0
  475. package/dist/tests/scholarships/policies/DisciplineCountry.test.mjs +151 -0
  476. package/dist/tests/scholarships/policies/Unfiltered.test.d.mts +1 -0
  477. package/dist/tests/scholarships/policies/Unfiltered.test.mjs +44 -0
  478. package/dist/tests/scholarships/policies/UniversityCountry.test.d.mts +1 -0
  479. package/dist/tests/scholarships/policies/UniversityCountry.test.mjs +115 -0
  480. package/dist/tests/scholarships/rules/ExceptAustaliaAreasRule.test.d.mts +1 -0
  481. package/dist/tests/scholarships/rules/ExceptAustaliaAreasRule.test.mjs +64 -0
  482. package/dist/tests/scholarships/rules/SearchVolumeAreasRule.test.d.mts +1 -0
  483. package/dist/tests/scholarships/rules/SearchVolumeAreasRule.test.mjs +62 -0
  484. package/dist/tests/scholarships/rules/SearchVolumeCountriesDisciplinesRule.test.d.mts +1 -0
  485. package/dist/tests/scholarships/rules/SearchVolumeCountriesDisciplinesRule.test.mjs +114 -0
  486. package/dist/tests/scholarships/rules/SearchVolumeCountriesRule.test.d.mts +1 -0
  487. package/dist/tests/scholarships/rules/SearchVolumeCountriesRule.test.mjs +62 -0
  488. package/dist/tests/scholarships/rules/SearchVolumeDisciplinesRule.test.d.mts +1 -0
  489. package/dist/tests/scholarships/rules/SearchVolumeDisciplinesRule.test.mjs +62 -0
  490. package/dist/tests/scholarships/utils/SearchDependencies.util.d.mts +16 -0
  491. package/dist/tests/scholarships/utils/SearchDependencies.util.mjs +70 -0
  492. package/dist/tests/scholarships/utils/SitemapDependencies.util.d.mts +11 -0
  493. package/dist/tests/scholarships/utils/SitemapDependencies.util.mjs +33 -0
  494. package/dist/tests/sitemap-generator/BaseSitemapUrlGeneratorManager.test.d.mts +1 -0
  495. package/dist/tests/sitemap-generator/BaseSitemapUrlGeneratorManager.test.mjs +82 -0
  496. package/dist/tests/sitemap-generator/OrganisationsSitemapUrlGeneratorManager.test.d.mts +1 -0
  497. package/dist/tests/sitemap-generator/OrganisationsSitemapUrlGeneratorManager.test.mjs +85 -0
  498. package/dist/tests/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.test.d.mts +1 -0
  499. package/dist/tests/sitemap-generator/ProgrammesSitemapUrlGeneratorManager.test.mjs +77 -0
  500. package/dist/tests/sitemap-generator/ScholarshipsSitemapUrlGeneratorManager.test.d.mts +1 -0
  501. package/dist/tests/sitemap-generator/ScholarshipsSitemapUrlGeneratorManager.test.mjs +60 -0
  502. package/dist/tests/structured-data/OrganisationStructuredDataFactory.test.d.mts +1 -0
  503. package/dist/tests/structured-data/OrganisationStructuredDataFactory.test.mjs +334 -0
  504. package/dist/tests/structured-data/ProgrammeStructuredDataFactory.test.d.mts +1 -0
  505. package/dist/tests/structured-data/ProgrammeStructuredDataFactory.test.mjs +562 -0
  506. package/dist/tests/structured-data/ScholarshipStructuredDataFactory.test.d.mts +1 -0
  507. package/dist/tests/structured-data/ScholarshipStructuredDataFactory.test.mjs +292 -0
  508. package/dist/tests/structured-data/SearchStructuredDataFactory.paywall.test.d.mts +1 -0
  509. package/dist/tests/structured-data/SearchStructuredDataFactory.paywall.test.mjs +258 -0
  510. package/package.json +1 -1
  511. package/dist/src/programmes/policies/AttendanceTuitionFee.d.ts +0 -17
  512. package/dist/src/programmes/policies/AttendanceTuitionFee.js +0 -51
  513. package/dist/src/programmes/policies/ContinentTuitionFee.d.ts +0 -16
  514. package/dist/src/programmes/policies/ContinentTuitionFee.js +0 -46
  515. package/dist/src/programmes/policies/CountryTuitionFee.d.ts +0 -16
  516. package/dist/src/programmes/policies/CountryTuitionFee.js +0 -46
  517. package/dist/src/programmes/policies/DegreeAreaTuitionFee.d.ts +0 -16
  518. package/dist/src/programmes/policies/DisciplineTuitionFee.js +0 -46
  519. package/dist/src/programmes/policies/DisciplineTuitionFeeAttendance.d.ts +0 -17
  520. package/dist/src/programmes/policies/DisciplineTuitionFeeAttendance.js +0 -54
@@ -0,0 +1,292 @@
1
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
2
+ import Validator from '@adobe/structured-data-validator';
3
+ import { ScholarshipStructuredDataFactory } from '@/structured-data/ScholarshipStructuredDataFactory';
4
+ describe('ScholarshipStructuredDataFactory', () => {
5
+ let factory;
6
+ let mockCurrencyService;
7
+ let mockScholarshipCards;
8
+ let validator;
9
+ beforeEach(async () => {
10
+ // Fetch the current schema.org schema and create validator instance
11
+ const schemaOrgJson = await (await fetch('https://schema.org/version/latest/schemaorg-current-https.jsonld')).json();
12
+ validator = new Validator(schemaOrgJson);
13
+ // Mock the currency conversion service
14
+ mockCurrencyService = {
15
+ convert: vi.fn().mockResolvedValue(5000) // Mock conversion to USD
16
+ };
17
+ factory = new ScholarshipStructuredDataFactory(mockCurrencyService);
18
+ Object.defineProperty(global, 'window', {
19
+ value: {
20
+ location: {
21
+ host: 'studyportals.com'
22
+ }
23
+ }
24
+ });
25
+ // Create mock data
26
+ setupMockData();
27
+ });
28
+ function setupMockData() {
29
+ // Mock scholarship cards
30
+ mockScholarshipCards = createMockScholarshipCards();
31
+ }
32
+ function createMockScholarshipCards() {
33
+ // Card 1 - Scholarship with monetary value
34
+ const card1 = {
35
+ getScholarshipVirtualName: vi.fn().mockReturnValue('/scholarships/tech-excellence-scholarship'),
36
+ getScholarshipTitle: vi.fn().mockReturnValue('Tech Excellence Scholarship'),
37
+ getDescriptionOfApplicationBasis: vi.fn().mockReturnValue('Merit-based scholarship for outstanding computer science students'),
38
+ getProviderName: vi.fn().mockReturnValue('Tech University Foundation'),
39
+ getDescriptionOfBenefits: vi.fn().mockReturnValue('10000 USD full tuition coverage')
40
+ };
41
+ // Card 2 - Scholarship with non-monetary benefits
42
+ const card2 = {
43
+ getScholarshipVirtualName: vi.fn().mockReturnValue('/scholarships/research-opportunity-grant'),
44
+ getScholarshipTitle: vi.fn().mockReturnValue('Research Opportunity Grant'),
45
+ getDescriptionOfApplicationBasis: vi.fn().mockReturnValue('Research-based opportunity for graduate students'),
46
+ getProviderName: vi.fn().mockReturnValue('International Research Institute'),
47
+ getDescriptionOfBenefits: vi.fn().mockReturnValue('Research mentorship and laboratory access')
48
+ };
49
+ // Card 3 - Scholarship with monetary value in different currency
50
+ const card3 = {
51
+ getScholarshipVirtualName: vi.fn().mockReturnValue('/scholarships/european-excellence-award'),
52
+ getScholarshipTitle: vi.fn().mockReturnValue('European Excellence Award'),
53
+ getDescriptionOfApplicationBasis: vi.fn().mockReturnValue('Academic excellence award for European students'),
54
+ getProviderName: vi.fn().mockReturnValue('European Education Foundation'),
55
+ getDescriptionOfBenefits: vi.fn().mockReturnValue('8000 EUR partial tuition support')
56
+ };
57
+ // Card 4 - Scholarship with missing optional fields
58
+ const card4 = {
59
+ getScholarshipVirtualName: vi.fn().mockReturnValue('/scholarships/basic-support-grant'),
60
+ getScholarshipTitle: vi.fn().mockReturnValue(null),
61
+ getDescriptionOfApplicationBasis: vi.fn().mockReturnValue(null),
62
+ getProviderName: vi.fn().mockReturnValue(null),
63
+ getDescriptionOfBenefits: vi.fn().mockReturnValue(null)
64
+ };
65
+ // Card 5 - Scholarship with invalid monetary format
66
+ const card5 = {
67
+ getScholarshipVirtualName: vi.fn().mockReturnValue('/scholarships/invalid-format-scholarship'),
68
+ getScholarshipTitle: vi.fn().mockReturnValue('Invalid Format Scholarship'),
69
+ getDescriptionOfApplicationBasis: vi.fn().mockReturnValue('Test scholarship with invalid format'),
70
+ getProviderName: vi.fn().mockReturnValue('Test Foundation'),
71
+ getDescriptionOfBenefits: vi.fn().mockReturnValue('Invalid amount format')
72
+ };
73
+ return [card1, card2, card3, card4, card5];
74
+ }
75
+ describe('buildStructuredDataForCard', () => {
76
+ it('should build MonetaryGrant structured data for scholarship with monetary value', async () => {
77
+ const entity = {
78
+ card: mockScholarshipCards[0],
79
+ offer: undefined,
80
+ reviewRating: undefined,
81
+ paywall: undefined
82
+ };
83
+ const result = await factory['buildStructuredDataForCard'](entity);
84
+ expect(result).toBeDefined();
85
+ expect(result?.['@type']).toBe('MonetaryGrant');
86
+ expect(result?.name).toBe('Tech Excellence Scholarship');
87
+ expect(result?.description).toBe('Merit-based scholarship for outstanding computer science students');
88
+ expect(result?.funder).toBe('Tech University Foundation');
89
+ expect(result?.url).toBe('https://studyportals.com/scholarships/tech-excellence-scholarship');
90
+ expect(result?.amount).toBeDefined();
91
+ expect(result?.amount?.['@type']).toBe('MonetaryAmount');
92
+ expect(result?.amount?.value).toBe(5000); // Mocked conversion result
93
+ expect(result?.amount?.currency).toBe('USD');
94
+ });
95
+ it('should build MonetaryGrant structured data for scholarship with non-monetary benefits', async () => {
96
+ const entity = {
97
+ card: mockScholarshipCards[1],
98
+ offer: undefined,
99
+ reviewRating: undefined,
100
+ paywall: undefined
101
+ };
102
+ const result = await factory['buildStructuredDataForCard'](entity);
103
+ expect(result).toBeDefined();
104
+ expect(result?.['@type']).toBe('MonetaryGrant');
105
+ expect(result?.name).toBe('Research Opportunity Grant');
106
+ expect(result?.description).toBe('Research-based opportunity for graduate students');
107
+ expect(result?.funder).toBe('International Research Institute');
108
+ expect(result?.url).toBe('https://studyportals.com/scholarships/research-opportunity-grant');
109
+ expect(result?.amount).toBeDefined();
110
+ expect(result?.amount?.['@type']).toBe('MonetaryAmount');
111
+ expect(result?.amount?.value).toBe('Research mentorship and laboratory access');
112
+ expect(result?.amount?.currency).toBeUndefined();
113
+ });
114
+ it('should handle scholarship with missing optional fields', async () => {
115
+ const entity = {
116
+ card: mockScholarshipCards[3],
117
+ offer: undefined,
118
+ reviewRating: undefined,
119
+ paywall: undefined
120
+ };
121
+ const result = await factory['buildStructuredDataForCard'](entity);
122
+ expect(result).toBeDefined();
123
+ expect(result?.['@type']).toBe('MonetaryGrant');
124
+ expect(result?.name).toBeUndefined();
125
+ expect(result?.description).toBeUndefined();
126
+ expect(result?.funder).toBeUndefined();
127
+ expect(result?.url).toBe('https://studyportals.com/scholarships/basic-support-grant');
128
+ expect(result?.amount).toBeDefined();
129
+ expect(result?.amount?.['@type']).toBe('MonetaryAmount');
130
+ expect(result?.amount?.value).toBeUndefined();
131
+ });
132
+ it('should add paywall data when provided', async () => {
133
+ const paywallData = {
134
+ isAccessibleForFree: false,
135
+ cssSelector: '.Paywalled',
136
+ accessMode: 'registration'
137
+ };
138
+ const entity = {
139
+ card: mockScholarshipCards[0],
140
+ offer: undefined,
141
+ reviewRating: undefined,
142
+ paywall: paywallData
143
+ };
144
+ const result = await factory['buildStructuredDataForCard'](entity);
145
+ expect(result).toBeDefined();
146
+ expect(result?.isAccessibleForFree).toBe(false);
147
+ // Note: cssSelector and accessMode are not added by the base class addPaywallToStructuredData method
148
+ // Only isAccessibleForFree is added to the structured data
149
+ });
150
+ });
151
+ describe('getOfferData', () => {
152
+ it('should return offer data for scholarship with monetary value', async () => {
153
+ const card = mockScholarshipCards[0]; // Has "10000 USD" benefits
154
+ const result = await factory['getOfferData'](card);
155
+ expect(result).toBeDefined();
156
+ expect(result?.price).toBe(5000); // Mocked conversion result
157
+ expect(result?.category).toBe('tuition');
158
+ expect(result?.validFrom).toBeUndefined();
159
+ expect(mockCurrencyService.convert).toHaveBeenCalledWith(10000, 'USD', 'USD');
160
+ });
161
+ it('should return offer data for scholarship with different currency', async () => {
162
+ const card = mockScholarshipCards[2]; // Has "8000 EUR" benefits
163
+ const result = await factory['getOfferData'](card);
164
+ expect(result).toBeDefined();
165
+ expect(result?.price).toBe(5000); // Mocked conversion result
166
+ expect(result?.category).toBe('tuition');
167
+ expect(result?.validFrom).toBeUndefined();
168
+ expect(mockCurrencyService.convert).toHaveBeenCalledWith(8000, 'EUR', 'USD');
169
+ });
170
+ it('should return undefined for scholarship with non-monetary benefits', async () => {
171
+ const card = mockScholarshipCards[1]; // Has non-monetary benefits
172
+ const result = await factory['getOfferData'](card);
173
+ expect(result).toBeUndefined();
174
+ });
175
+ it('should return undefined for scholarship with no benefits', async () => {
176
+ const card = mockScholarshipCards[3]; // Has null benefits
177
+ const result = await factory['getOfferData'](card);
178
+ expect(result).toBeUndefined();
179
+ });
180
+ it('should return undefined for scholarship with invalid monetary format', async () => {
181
+ const card = mockScholarshipCards[4]; // Has invalid format
182
+ const result = await factory['getOfferData'](card);
183
+ expect(result).toBeUndefined();
184
+ });
185
+ });
186
+ describe('getPaywallData', () => {
187
+ it('should return correct paywall configuration', () => {
188
+ const result = factory['getPaywallData']();
189
+ expect(result).toBeDefined();
190
+ expect(result?.isAccessibleForFree).toBe(false);
191
+ expect(result?.cssSelector).toBe('.Paywalled');
192
+ expect(result?.accessMode).toBe('registration');
193
+ });
194
+ });
195
+ describe('buildAmount', () => {
196
+ it('should build amount with currency conversion for monetary benefits', async () => {
197
+ const card = mockScholarshipCards[0]; // Has "10000 USD" benefits
198
+ const result = await factory['buildAmount'](card);
199
+ expect(result).toBeDefined();
200
+ expect(result?.['@type']).toBe('MonetaryAmount');
201
+ expect(result?.value).toBe(5000); // Mocked conversion result
202
+ expect(result?.currency).toBe('USD');
203
+ expect(mockCurrencyService.convert).toHaveBeenCalledWith(10000, 'USD', 'USD');
204
+ });
205
+ it('should build amount with different currency conversion', async () => {
206
+ const card = mockScholarshipCards[2]; // Has "8000 EUR" benefits
207
+ const result = await factory['buildAmount'](card);
208
+ expect(result).toBeDefined();
209
+ expect(result?.['@type']).toBe('MonetaryAmount');
210
+ expect(result?.value).toBe(5000); // Mocked conversion result
211
+ expect(result?.currency).toBe('USD');
212
+ expect(mockCurrencyService.convert).toHaveBeenCalledWith(8000, 'EUR', 'USD');
213
+ });
214
+ it('should build amount with textual value for non-monetary benefits', async () => {
215
+ const card = mockScholarshipCards[1]; // Has non-monetary benefits
216
+ const result = await factory['buildAmount'](card);
217
+ expect(result).toBeDefined();
218
+ expect(result?.['@type']).toBe('MonetaryAmount');
219
+ expect(result?.value).toBe('Research mentorship and laboratory access');
220
+ expect(result?.currency).toBeUndefined();
221
+ });
222
+ it('should handle missing benefits gracefully', async () => {
223
+ const card = mockScholarshipCards[3]; // Has null benefits
224
+ const result = await factory['buildAmount'](card);
225
+ expect(result).toBeDefined();
226
+ expect(result?.['@type']).toBe('MonetaryAmount');
227
+ expect(result?.value).toBeUndefined();
228
+ expect(result?.currency).toBeUndefined();
229
+ });
230
+ it('should handle invalid monetary format', async () => {
231
+ const card = mockScholarshipCards[4]; // Has invalid format
232
+ const result = await factory['buildAmount'](card);
233
+ expect(result).toBeDefined();
234
+ expect(result?.['@type']).toBe('MonetaryAmount');
235
+ expect(result?.value).toBe('Invalid amount format');
236
+ expect(result?.currency).toBeUndefined();
237
+ });
238
+ });
239
+ describe('Schema.org validation', () => {
240
+ it('should generate valid MonetaryGrant schema for scholarship with monetary value', async () => {
241
+ const entity = {
242
+ card: mockScholarshipCards[0],
243
+ offer: undefined,
244
+ reviewRating: undefined,
245
+ paywall: undefined
246
+ };
247
+ const result = await factory['buildStructuredDataForCard'](entity);
248
+ expect(result).toBeDefined();
249
+ // Validate against schema.org using Adobe validator format
250
+ const validationResults = await validator.validate({ jsonld: { MonetaryGrant: [result] } });
251
+ expect(validationResults.filter((issue) => issue.severity === 'ERROR')).toHaveLength(0);
252
+ });
253
+ it('should generate valid MonetaryGrant schema for scholarship with non-monetary value', async () => {
254
+ const entity = {
255
+ card: mockScholarshipCards[1],
256
+ offer: undefined,
257
+ reviewRating: undefined,
258
+ paywall: undefined
259
+ };
260
+ const result = await factory['buildStructuredDataForCard'](entity);
261
+ expect(result).toBeDefined();
262
+ // Validate against schema.org using Adobe validator format
263
+ const validationResults = await validator.validate({ jsonld: { MonetaryGrant: [result] } });
264
+ expect(validationResults.filter((issue) => issue.severity === 'ERROR')).toHaveLength(0);
265
+ });
266
+ });
267
+ describe('Currency conversion edge cases', () => {
268
+ it('should handle currency conversion errors gracefully', async () => {
269
+ // Mock currency service to throw an error
270
+ mockCurrencyService.convert = vi.fn().mockRejectedValue(new Error('Conversion failed'));
271
+ const factoryWithFailingService = new ScholarshipStructuredDataFactory(mockCurrencyService);
272
+ const card = mockScholarshipCards[0];
273
+ // Should not throw, but handle the error gracefully
274
+ await expect(factoryWithFailingService['buildAmount'](card)).rejects.toThrow('Conversion failed');
275
+ });
276
+ it('should round conversion results to whole numbers', async () => {
277
+ // Mock currency service to return decimal value
278
+ mockCurrencyService.convert = vi.fn().mockResolvedValue(4999.75);
279
+ const card = mockScholarshipCards[0];
280
+ const result = await factory['getOfferData'](card);
281
+ expect(result?.price).toBe(5000); // Should be rounded
282
+ });
283
+ });
284
+ describe('Integration with base class', () => {
285
+ it('should properly extend SearchStructuredDataFactory', () => {
286
+ expect(factory).toBeInstanceOf(ScholarshipStructuredDataFactory);
287
+ expect(typeof factory['buildStructuredDataForCard']).toBe('function');
288
+ expect(typeof factory['getOfferData']).toBe('function');
289
+ expect(typeof factory['getPaywallData']).toBe('function');
290
+ });
291
+ });
292
+ });
@@ -0,0 +1,258 @@
1
+ import { describe, it, expect, beforeEach } from 'vitest';
2
+ import { SearchStructuredDataFactory } from '../../src/structured-data/SearchStructuredDataFactory';
3
+ import { PageTypes } from '../../src/enums/PageTypes';
4
+ class TestStructuredDataFactory extends SearchStructuredDataFactory {
5
+ paywallConfig;
6
+ buildStructuredDataForCard(entity) {
7
+ const structured = {
8
+ "@type": "Thing",
9
+ "@id": `https://example.com/${entity.card.id}`,
10
+ "name": entity.card.name,
11
+ "url": `https://example.com/${entity.card.id}`
12
+ };
13
+ // Add paywall information to the structured data if present
14
+ this.addPaywallToStructuredData(structured, entity.paywall);
15
+ return structured;
16
+ }
17
+ getPaywallData() {
18
+ return this.paywallConfig;
19
+ }
20
+ // Override the buildStructuredData method to manually create entities with paywall data
21
+ async buildStructuredData(title, description, cards, faqItems = [], breadcrumbs = [], listItemStructure = false, pageType) {
22
+ // Create entities with paywall data for cards that have paywall
23
+ const entities = cards.map(card => ({
24
+ card,
25
+ paywall: card.hasPaywall ? {
26
+ isAccessibleForFree: false,
27
+ cssSelector: '.paywall-container'
28
+ } : undefined
29
+ }));
30
+ // Call the parent method logic but with our custom entity processing
31
+ const mainEntities = [];
32
+ for (const entity of entities) {
33
+ const structuredData = await this.buildStructuredDataForCard(entity);
34
+ if (structuredData) {
35
+ mainEntities.push(structuredData);
36
+ }
37
+ }
38
+ const data = {
39
+ '@context': 'https://schema.org',
40
+ '@type': 'SearchResultsPage',
41
+ 'name': title,
42
+ description,
43
+ 'mainEntity': mainEntities
44
+ };
45
+ // Get page-level paywall data
46
+ const paywallData = this.getPaywallData();
47
+ // Construct page parts (FAQ + paywall element)
48
+ const parts = [];
49
+ if (faqItems.length > 0) {
50
+ parts.push({
51
+ '@type': 'FAQPage',
52
+ 'mainEntity': faqItems.map(item => ({
53
+ '@type': 'Question',
54
+ 'name': item.question,
55
+ 'acceptedAnswer': {
56
+ '@type': 'Answer',
57
+ 'text': item.answer
58
+ }
59
+ }))
60
+ });
61
+ }
62
+ if (paywallData && paywallData.cssSelector) {
63
+ parts.push({
64
+ '@type': 'WebPageElement',
65
+ 'isAccessibleForFree': paywallData.isAccessibleForFree,
66
+ 'cssSelector': paywallData.cssSelector
67
+ });
68
+ }
69
+ if (parts.length === 1 && parts[0]['@type'] === 'FAQPage') {
70
+ data.hasPart = parts[0];
71
+ }
72
+ else if (parts.length > 0) {
73
+ data.hasPart = parts;
74
+ }
75
+ if (paywallData) {
76
+ data.isAccessibleForFree = paywallData.isAccessibleForFree;
77
+ }
78
+ return data;
79
+ }
80
+ // Test helper method to set page-level paywall
81
+ setPagePaywall(paywall) {
82
+ this.paywallConfig = paywall;
83
+ }
84
+ }
85
+ describe('SearchStructuredDataFactory Paywall Support', () => {
86
+ let factory;
87
+ let mockCards;
88
+ beforeEach(() => {
89
+ factory = new TestStructuredDataFactory();
90
+ mockCards = [
91
+ { id: '1', name: 'Free Content' },
92
+ { id: '2', name: 'Premium Content', hasPaywall: true },
93
+ { id: '3', name: 'Another Free Content' }
94
+ ];
95
+ });
96
+ it('should generate structured data without paywall when no paywall data provided', async () => {
97
+ const result = await factory.buildStructuredData('Test Page', 'A test page', [{ id: '1', name: 'Free Content' }], [], []);
98
+ expect(result['@context']).toBe('https://schema.org');
99
+ expect(result['@type']).toBe('SearchResultsPage');
100
+ expect(result.name).toBe('Test Page');
101
+ expect(result.description).toBe('A test page');
102
+ expect(result.mainEntity).toHaveLength(1);
103
+ expect(result.isAccessibleForFree).toBeUndefined();
104
+ expect(result.hasPart).toBeUndefined();
105
+ });
106
+ it('should add page-level paywall information when paywall data provided', async () => {
107
+ const pagePaywall = {
108
+ isAccessibleForFree: false,
109
+ cssSelector: '.page-paywall'
110
+ };
111
+ factory.setPagePaywall(pagePaywall);
112
+ const result = await factory.buildStructuredData('Premium Content List', 'A list of premium content items', mockCards, [], []);
113
+ expect(result.isAccessibleForFree).toBe(false);
114
+ expect(result.hasPart).toBeDefined();
115
+ expect(Array.isArray(result.hasPart)).toBe(true);
116
+ const parts = result.hasPart;
117
+ const paywallElement = parts.find(part => part['@type'] === 'WebPageElement');
118
+ expect(paywallElement).toBeDefined();
119
+ expect(paywallElement.isAccessibleForFree).toBe(false);
120
+ expect(paywallElement.cssSelector).toBe('.page-paywall');
121
+ });
122
+ it('should add paywall information to individual cards when they have paywall data', async () => {
123
+ const result = await factory.buildStructuredData('Mixed Content', 'Free and premium content', mockCards, [], []);
124
+ expect(result.mainEntity).toHaveLength(3);
125
+ // Check the premium content item (index 1)
126
+ const premiumItem = result.mainEntity[1];
127
+ expect(premiumItem.name).toBe('Premium Content');
128
+ expect(premiumItem.isAccessibleForFree).toBe(false);
129
+ // Individual cards should not have a paywall object - only isAccessibleForFree
130
+ // Check the free content items (index 0 and 2)
131
+ const freeItem1 = result.mainEntity[0];
132
+ const freeItem2 = result.mainEntity[2];
133
+ expect(freeItem1.name).toBe('Free Content');
134
+ expect(freeItem1.isAccessibleForFree).toBeUndefined();
135
+ expect(freeItem2.name).toBe('Another Free Content');
136
+ expect(freeItem2.isAccessibleForFree).toBeUndefined();
137
+ });
138
+ it('should handle mixed FAQ and paywall in hasPart', async () => {
139
+ const faqItems = [
140
+ { question: 'What is this?', answer: 'This is a test' }
141
+ ];
142
+ const pagePaywall = {
143
+ isAccessibleForFree: false,
144
+ cssSelector: '.subscription-wall'
145
+ };
146
+ factory.setPagePaywall(pagePaywall);
147
+ const result = await factory.buildStructuredData('FAQ with Paywall', 'Content with both FAQ and paywall', mockCards, faqItems, []);
148
+ expect(result.hasPart).toBeDefined();
149
+ expect(Array.isArray(result.hasPart)).toBe(true);
150
+ const parts = result.hasPart;
151
+ expect(parts).toHaveLength(2);
152
+ const faqPage = parts.find(part => part['@type'] === 'FAQPage');
153
+ const paywallElement = parts.find(part => part['@type'] === 'WebPageElement');
154
+ expect(faqPage).toBeDefined();
155
+ expect(paywallElement).toBeDefined();
156
+ expect(paywallElement.cssSelector).toBe('.subscription-wall');
157
+ });
158
+ it('should create paywall WebPageElement only when cssSelector is provided', async () => {
159
+ const pagePaywall = {
160
+ isAccessibleForFree: false
161
+ };
162
+ factory.setPagePaywall(pagePaywall);
163
+ const result = await factory.buildStructuredData('Paywall without CSS Selector', 'Should not create WebPageElement', mockCards, [], []);
164
+ expect(result.isAccessibleForFree).toBe(false);
165
+ expect(result.hasPart).toBeUndefined(); // No WebPageElement should be created without cssSelector
166
+ });
167
+ });
168
+ // Simple test factory that uses parent's buildStructuredData method
169
+ class SimpleTestStructuredDataFactory extends SearchStructuredDataFactory {
170
+ buildStructuredDataForCard(entity) {
171
+ return {
172
+ "@type": "Thing",
173
+ "@id": `https://example.com/${entity.card.id}`,
174
+ "name": entity.card.name,
175
+ "url": `https://example.com/${entity.card.id}`
176
+ };
177
+ }
178
+ }
179
+ describe('SearchStructuredDataFactory PageType Parameter', () => {
180
+ let factory;
181
+ let mockCards;
182
+ beforeEach(() => {
183
+ factory = new SimpleTestStructuredDataFactory();
184
+ mockCards = [
185
+ { id: '1', name: 'Content Item 1' },
186
+ { id: '2', name: 'Content Item 2' },
187
+ { id: '3', name: 'Content Item 3' }
188
+ ];
189
+ });
190
+ it('should use SearchResultsPage as default when pageType is not specified', async () => {
191
+ const result = await factory.buildStructuredData('Default Page Type Test', 'Testing default page type behavior', mockCards, [], []);
192
+ expect(result['@type']).toBe('SearchResultsPage');
193
+ expect(result['@context']).toBe('https://schema.org');
194
+ expect(result.name).toBe('Default Page Type Test');
195
+ expect(result.mainEntity).toHaveLength(3);
196
+ });
197
+ it('should use WebPage when pageType is explicitly set to WEB_PAGE', async () => {
198
+ const result = await factory.buildStructuredData('WebPage Type Test', 'Testing with explicit WebPage type', mockCards, [], [], false, PageTypes.WEB_PAGE);
199
+ expect(result['@type']).toBe('WebPage');
200
+ expect(result['@context']).toBe('https://schema.org');
201
+ expect(result.name).toBe('WebPage Type Test');
202
+ expect(result.mainEntity).toHaveLength(3);
203
+ });
204
+ it('should use SearchResultsPage when pageType is explicitly set to SEARCH_RESULTS_PAGE', async () => {
205
+ const result = await factory.buildStructuredData('SearchResultsPage Type Test', 'Testing with explicit SearchResultsPage type', mockCards, [], [], false, PageTypes.SEARCH_RESULTS_PAGE);
206
+ expect(result['@type']).toBe('SearchResultsPage');
207
+ expect(result['@context']).toBe('https://schema.org');
208
+ expect(result.name).toBe('SearchResultsPage Type Test');
209
+ });
210
+ it('should use WebPage when listItemStructure is true and no pageType specified', async () => {
211
+ const result = await factory.buildStructuredData('List Item Structure Test', 'Testing listItemStructure default behavior', mockCards, [], [], true // listItemStructure = true
212
+ );
213
+ expect(result['@type']).toBe('WebPage');
214
+ // Verify that listItemStructure wrapped items properly
215
+ expect(result.mainEntity).toHaveLength(1);
216
+ expect(result.mainEntity[0]['@type']).toBe('ItemList');
217
+ expect(result.mainEntity[0].numberOfItems).toBe(3);
218
+ });
219
+ it('should override listItemStructure default when pageType is explicitly provided', async () => {
220
+ const result = await factory.buildStructuredData('Override Test', 'Testing pageType override of listItemStructure', mockCards, [], [], true, // listItemStructure = true (would default to WebPage)
221
+ PageTypes.SEARCH_RESULTS_PAGE // but we explicitly want SearchResultsPage
222
+ );
223
+ expect(result['@type']).toBe('SearchResultsPage');
224
+ // Still should have listItemStructure wrapping
225
+ expect(result.mainEntity).toHaveLength(1);
226
+ expect(result.mainEntity[0]['@type']).toBe('ItemList');
227
+ });
228
+ it('should maintain all structured data properties when using WebPage type', async () => {
229
+ const faqItems = [
230
+ { question: 'What is this?', answer: 'This is a test' }
231
+ ];
232
+ const result = await factory.buildStructuredData('WebPage with All Features', 'Testing WebPage type with FAQ', mockCards, faqItems, [], false, PageTypes.WEB_PAGE);
233
+ expect(result['@type']).toBe('WebPage');
234
+ expect(result['@context']).toBe('https://schema.org');
235
+ expect(result.name).toBe('WebPage with All Features');
236
+ expect(result.description).toBe('Testing WebPage type with FAQ');
237
+ expect(result.mainEntity).toHaveLength(3);
238
+ expect(result.hasPart).toBeDefined();
239
+ expect(result.hasPart['@type']).toBe('FAQPage');
240
+ });
241
+ it('should work with empty cards array and custom pageType', async () => {
242
+ const result = await factory.buildStructuredData('Empty Results', 'No content found', [], [], [], false, PageTypes.WEB_PAGE);
243
+ expect(result['@type']).toBe('WebPage');
244
+ expect(result.mainEntity).toHaveLength(0);
245
+ });
246
+ it('should combine pageType with listItemStructure and maintain ItemList wrapping', async () => {
247
+ const result = await factory.buildStructuredData('Combined Test', 'Testing pageType with listItemStructure', mockCards.slice(0, 2), [], [], true, PageTypes.WEB_PAGE);
248
+ expect(result['@type']).toBe('WebPage');
249
+ expect(result.mainEntity).toHaveLength(1);
250
+ const itemList = result.mainEntity[0];
251
+ expect(itemList['@type']).toBe('ItemList');
252
+ expect(itemList.numberOfItems).toBe(2);
253
+ expect(itemList.itemListElement).toHaveLength(2);
254
+ expect(itemList.itemListElement[0]['@type']).toBe('ListItem');
255
+ expect(itemList.itemListElement[0].position).toBe(1);
256
+ expect(itemList.itemListElement[1].position).toBe(2);
257
+ });
258
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studyportals/fawkes",
3
- "version": "8.7.0",
3
+ "version": "8.7.1-0",
4
4
  "description": "A package to centralize SEO related logic for SBLP and Sitemap Generator.",
5
5
  "files": [
6
6
  "./dist"
@@ -1,17 +0,0 @@
1
- import { FilterKey } from '@studyportals/search-filters/server-side';
2
- import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
- import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
- import { FilterCombinations } from '../../enums/FilterCombinations';
5
- import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
6
- import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
7
- import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
8
- import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
9
- export declare class AttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
10
- readonly name: string;
11
- readonly description: string;
12
- readonly filterKeys: FilterKey[];
13
- protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | OnlineAttendanceRule | AffordableTuitionFeeRule)[];
14
- constructor(dependencies: IProgrammeSeoDependencies);
15
- protected generateUrls(): Promise<string[]>;
16
- get filterCombination(): FilterCombinations;
17
- }
@@ -1,51 +0,0 @@
1
- import { FilterKey } from '@studyportals/search-filters/server-side';
2
- import { TuitionFeeFilterOptionValue } from '@studyportals/search-filters/server-side';
3
- import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
4
- import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
5
- import { FilterCombinations } from '../../enums/FilterCombinations';
6
- import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
- import { TuitionFeePresenter } from '../../presenters/TuitionFeePresenter';
8
- import { AttendancePresenter } from '../../presenters/AttendancePresenter';
9
- import { OnlineAttendanceRule } from '../../common/rules/OnlineAttendanceRule';
10
- import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
11
- export class AttendanceTuitionFee extends ProgrammesBaseIndexabilityPolicy {
12
- name = 'Tuition Fee Attendance Policy';
13
- description = 'Determines indexing rules for pages filtered by tuition fee and attendance.';
14
- filterKeys = [FilterKey.TUITION_FEE, FilterKey.DELIVERY_METHOD];
15
- rules = [
16
- new SingleValueSelectedForFilterRule(FilterKey.DELIVERY_METHOD),
17
- new SingleValueSelectedForFilterRule(FilterKey.TUITION_FEE),
18
- new OnlyFiltersSelectedRule([FilterKey.DELIVERY_METHOD, FilterKey.TUITION_FEE]),
19
- new OnlineAttendanceRule(),
20
- new AffordableTuitionFeeRule()
21
- ];
22
- constructor(dependencies) {
23
- super(dependencies);
24
- this.initateBaseRules();
25
- }
26
- async generateUrls() {
27
- const attendanceFragments = AttendancePresenter.getInstance().getFragments();
28
- const tuitionFeeFragments = TuitionFeePresenter.getInstance().getFragments();
29
- const paths = [];
30
- const affordableTuition = tuitionFeeFragments.find(t => t.id === TuitionFeeFilterOptionValue.ZERO_TO_TWO_THOUSAND_FIVE_HUNDRED);
31
- if (!affordableTuition) {
32
- return paths;
33
- }
34
- for (const pageNumber of this.indexablePageNumbers) {
35
- for (const attendance of attendanceFragments) {
36
- const filterKeyValues = new Map([
37
- [FilterKey.DELIVERY_METHOD, [attendance.id]],
38
- [FilterKey.TUITION_FEE, [affordableTuition.id]]
39
- ]);
40
- const result = await this.checkRulesForSitemapWithPageNumber(filterKeyValues, pageNumber);
41
- if (result) {
42
- paths.push(this.getPathWithPageNumber(`${affordableTuition.path}/${attendance.path}`, pageNumber));
43
- }
44
- }
45
- }
46
- return paths;
47
- }
48
- get filterCombination() {
49
- return FilterCombinations.ATTENDANCE_TUITION_FEE;
50
- }
51
- }
@@ -1,16 +0,0 @@
1
- import { FilterKey } from '@studyportals/search-filters/server-side';
2
- import { OnlyFiltersSelectedRule } from '../../common/rules/OnlyFiltersSelectedRule';
3
- import { SingleValueSelectedForFilterRule } from '../../common/rules/SingleValueSelectedForFilterRule';
4
- import { FilterCombinations } from '../../enums/FilterCombinations';
5
- import { AffordableTuitionFeeRule } from '../rules/AffordableTuitionFeeRule';
6
- import { ProgrammesBaseIndexabilityPolicy } from '../ProgrammesBaseIndexabilityPolicy';
7
- import { IProgrammeSeoDependencies } from '../types/IProgrammeSeoDependencies';
8
- export declare class ContinentTuitionFee extends ProgrammesBaseIndexabilityPolicy {
9
- readonly name: string;
10
- readonly description: string;
11
- readonly filterKeys: FilterKey[];
12
- protected readonly rules: (SingleValueSelectedForFilterRule | OnlyFiltersSelectedRule | AffordableTuitionFeeRule)[];
13
- constructor(dependencies: IProgrammeSeoDependencies);
14
- protected generateUrls(): Promise<string[]>;
15
- get filterCombination(): FilterCombinations;
16
- }