@studyportals/fawkes 2.0.1-24 → 2.0.1-25

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.
@@ -0,0 +1,8 @@
1
+ import { ISeoInfoBase, ISeoFilterState, ISeoFilterOptions, ISeoSearchApplicationState } from "../common";
2
+ import { IDependencies } from "./IDependencies";
3
+ export interface ISearchDependencies extends IDependencies {
4
+ seoInfoBase: ISeoInfoBase;
5
+ filterState: ISeoFilterState;
6
+ filterOptions?: ISeoFilterOptions;
7
+ applicationState?: ISeoSearchApplicationState;
8
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,10 +1,9 @@
1
1
  import { BaseSeoIndexabilityPolicy } from "./BaseSeoIndexabilityPolicy";
2
2
  import { SeoDependencies } from "../types/SeoDependencies";
3
- import { ICustomRule } from "./ICustomRule";
3
+ import { ISearchDependencies } from "./ISearchDependencies";
4
4
  import { IFilterKeyValues } from "./IFilterKeyValues";
5
5
  export declare abstract class RuleBasedIndexabilityPolicy extends BaseSeoIndexabilityPolicy {
6
- protected abstract rules: ICustomRule[];
7
6
  constructor(dependencies: SeoDependencies);
8
- protected checksEveryRuleForSearch(filterKeyValues: IFilterKeyValues): boolean;
9
- protected checksEveryRuleForSitemap(filterKeyValues: IFilterKeyValues): boolean;
7
+ protected abstract checksRulesForSearch(searchDependencies: ISearchDependencies): boolean;
8
+ protected abstract checksRulesForSitemap(filters?: IFilterKeyValues): boolean;
10
9
  }
@@ -3,10 +3,4 @@ export class RuleBasedIndexabilityPolicy extends BaseSeoIndexabilityPolicy {
3
3
  constructor(dependencies) {
4
4
  super(dependencies);
5
5
  }
6
- checksEveryRuleForSearch(filterKeyValues) {
7
- return this.rules.every(rule => rule.forSearch(filterKeyValues));
8
- }
9
- checksEveryRuleForSitemap(filterKeyValues) {
10
- return this.rules.every(rule => rule.forSitemapGenerator(filterKeyValues));
11
- }
12
6
  }
@@ -1,12 +1,14 @@
1
1
  import { FilterCombinations } from '../../enums/FilterCombinations';
2
2
  import { SeoDependencies } from '../../types/SeoDependencies';
3
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
3
4
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
4
- import { ICustomRule } from '../../common/ICustomRule';
5
5
  import { ISeoIndexabilityPolicy } from '../../common/ISeoIndexabilityPolicy';
6
+ import { IFilterKeyValues } from '../../common/IFilterKeyValues';
6
7
  export declare class AreaPolicy extends RuleBasedIndexabilityPolicy implements ISeoIndexabilityPolicy {
7
- protected rules: ICustomRule[];
8
8
  constructor(dependencies: SeoDependencies);
9
9
  protected matchesFilters(): Promise<boolean>;
10
10
  generateUrls(): Promise<string[]>;
11
11
  get filterCombination(): FilterCombinations;
12
+ protected checksRulesForSearch(dependencies: ISearchDependencies): boolean;
13
+ protected checksRulesForSitemap(filterKeyValues: IFilterKeyValues): boolean;
12
14
  }
@@ -5,10 +5,6 @@ import { ExceptAustraliaAreasRule } from '../rules/ExceptAustaliaAreasRule';
5
5
  import { SearchVolumeAreasRule } from '../rules/SearchVolumeAreasRule';
6
6
  import { AreaPresenter } from '../../presenters/AreaPresenter';
7
7
  export class AreaPolicy extends RuleBasedIndexabilityPolicy {
8
- rules = [
9
- SearchVolumeAreasRule.getInstance(),
10
- ExceptAustraliaAreasRule.getInstance()
11
- ];
12
8
  constructor(dependencies) {
13
9
  super(dependencies);
14
10
  }
@@ -23,10 +19,7 @@ export class AreaPolicy extends RuleBasedIndexabilityPolicy {
23
19
  FilterKey.AREA,
24
20
  FilterKey.COUNTRY
25
21
  ], filterState);
26
- const areaSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.AREA, filterState);
27
- const hasSearchVolumeAndNotAustralia = this.checksEveryRuleForSearch({
28
- [FilterKey.AREA]: areaSelected ?? undefined
29
- });
22
+ const hasSearchVolumeAndNotAustralia = this.checksRulesForSearch(this.dependencies);
30
23
  return singleAreaSelected
31
24
  && singleCountrySelected
32
25
  && onlyAreaAndCountrySelected
@@ -35,8 +28,9 @@ export class AreaPolicy extends RuleBasedIndexabilityPolicy {
35
28
  async generateUrls() {
36
29
  const areaFragments = AreaPresenter.getInstance().getFragments();
37
30
  const paths = areaFragments
38
- .filter(area => this.checksEveryRuleForSitemap({
39
- [FilterKey.COUNTRY]: area.countryId
31
+ .filter(area => this.checksRulesForSitemap({
32
+ [FilterKey.COUNTRY]: area.countryId,
33
+ [FilterKey.AREA]: area.id
40
34
  }))
41
35
  .map(area => area.path);
42
36
  return Promise.resolve(paths);
@@ -44,4 +38,24 @@ export class AreaPolicy extends RuleBasedIndexabilityPolicy {
44
38
  get filterCombination() {
45
39
  return FilterCombinations.AREA;
46
40
  }
41
+ checksRulesForSearch(dependencies) {
42
+ const { seoInfoBase, filterState } = dependencies;
43
+ const exceptAustraliaAreasRule = ExceptAustraliaAreasRule.getInstance();
44
+ const areaSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.AREA, filterState);
45
+ const notInAustralia = exceptAustraliaAreasRule.forSearch({
46
+ [FilterKey.AREA]: areaSelected ?? undefined
47
+ });
48
+ const searchVolumeAreasRule = SearchVolumeAreasRule.getInstance();
49
+ const hasSearchVolume = searchVolumeAreasRule.forSearch({
50
+ [FilterKey.AREA]: areaSelected ?? undefined
51
+ });
52
+ return notInAustralia && hasSearchVolume;
53
+ }
54
+ checksRulesForSitemap(filterKeyValues) {
55
+ const exceptAustraliaAreasRule = ExceptAustraliaAreasRule.getInstance();
56
+ const notInAustralia = exceptAustraliaAreasRule.forSitemapGenerator(filterKeyValues);
57
+ const searchVolumeAreasRule = SearchVolumeAreasRule.getInstance();
58
+ const hasSearchVolume = searchVolumeAreasRule.forSitemapGenerator(filterKeyValues);
59
+ return notInAustralia && hasSearchVolume;
60
+ }
47
61
  }
@@ -1,12 +1,14 @@
1
1
  import { FilterCombinations } from '../../enums/FilterCombinations';
2
- import { ICustomRule } from '../../common/ICustomRule';
2
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
3
3
  import { SeoDependencies } from '../../types/SeoDependencies';
4
4
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
5
5
  import { ISeoIndexabilityPolicy } from '../../common/ISeoIndexabilityPolicy';
6
+ import { IFilterKeyValues } from '../../common/IFilterKeyValues';
6
7
  export declare class CountryPolicy extends RuleBasedIndexabilityPolicy implements ISeoIndexabilityPolicy {
7
- protected rules: ICustomRule[];
8
8
  constructor(dependencies: SeoDependencies);
9
9
  protected matchesFilters(): Promise<boolean>;
10
10
  generateUrls(): Promise<string[]>;
11
11
  get filterCombination(): FilterCombinations;
12
+ protected checksRulesForSearch(dependencies: ISearchDependencies): boolean;
13
+ protected checksRulesForSitemap(filters: IFilterKeyValues): boolean;
12
14
  }
@@ -4,9 +4,6 @@ import { SearchVolumeCountriesRule } from '../rules/SearchVolumeCountriesRule';
4
4
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
5
5
  import { CountryPresenter } from '../../presenters/CountryPresenter';
6
6
  export class CountryPolicy extends RuleBasedIndexabilityPolicy {
7
- rules = [
8
- SearchVolumeCountriesRule.getInstance()
9
- ];
10
7
  constructor(dependencies) {
11
8
  super(dependencies);
12
9
  }
@@ -16,10 +13,7 @@ export class CountryPolicy extends RuleBasedIndexabilityPolicy {
16
13
  const onlyCountrySelected = await seoInfoBase.selectionOnlyFor([
17
14
  FilterKey.COUNTRY
18
15
  ], filterState);
19
- const countrySelected = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
20
- const hasSearchVolume = this.checksEveryRuleForSearch({
21
- [FilterKey.COUNTRY]: countrySelected ?? undefined
22
- });
16
+ const hasSearchVolume = this.checksRulesForSearch(this.dependencies);
23
17
  return singleCountrySelected
24
18
  && onlyCountrySelected
25
19
  && hasSearchVolume;
@@ -27,7 +21,7 @@ export class CountryPolicy extends RuleBasedIndexabilityPolicy {
27
21
  generateUrls() {
28
22
  const countryFragments = CountryPresenter.getInstance().getFragments();
29
23
  const paths = countryFragments
30
- .filter(country => this.checksEveryRuleForSitemap({
24
+ .filter(country => this.checksRulesForSitemap({
31
25
  [FilterKey.COUNTRY]: country.id
32
26
  }))
33
27
  .map(country => country.path);
@@ -36,4 +30,17 @@ export class CountryPolicy extends RuleBasedIndexabilityPolicy {
36
30
  get filterCombination() {
37
31
  return FilterCombinations.COUNTRY;
38
32
  }
33
+ checksRulesForSearch(dependencies) {
34
+ const { seoInfoBase, filterState } = dependencies;
35
+ const hasSearchVolumeRule = SearchVolumeCountriesRule.getInstance();
36
+ const countrySelected = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
37
+ const hasSearchVolume = hasSearchVolumeRule.forSearch({
38
+ [FilterKey.COUNTRY]: countrySelected ?? undefined
39
+ });
40
+ return hasSearchVolume;
41
+ }
42
+ checksRulesForSitemap(filters) {
43
+ const hasSearchVolumeRule = SearchVolumeCountriesRule.getInstance();
44
+ return hasSearchVolumeRule.forSitemapGenerator(filters);
45
+ }
39
46
  }
@@ -1,12 +1,14 @@
1
1
  import { ISeoIndexabilityPolicy } from '../../common/ISeoIndexabilityPolicy';
2
2
  import { FilterCombinations } from '../../enums/FilterCombinations';
3
3
  import { SeoDependencies } from '../../types/SeoDependencies';
4
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
4
5
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
5
- import { ICustomRule } from '../../common/ICustomRule';
6
+ import { IFilterKeyValues } from '../../common/IFilterKeyValues';
6
7
  export declare class DisciplineCountryPolicy extends RuleBasedIndexabilityPolicy implements ISeoIndexabilityPolicy {
7
- protected rules: ICustomRule[];
8
8
  constructor(dependencies: SeoDependencies);
9
9
  protected matchesFilters(): Promise<boolean>;
10
10
  generateUrls(): Promise<string[]>;
11
11
  get filterCombination(): FilterCombinations;
12
+ protected checksRulesForSearch(dependencies: ISearchDependencies): boolean;
13
+ protected checksRulesForSitemap(filters: IFilterKeyValues): boolean;
12
14
  }
@@ -4,9 +4,6 @@ import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityP
4
4
  import { SearchVolumeCountriesDisciplinesRule } from '../rules/SearchVolumeCountryDisciplineRule';
5
5
  import { CountryPresenter } from '../../presenters/CountryPresenter';
6
6
  export class DisciplineCountryPolicy extends RuleBasedIndexabilityPolicy {
7
- rules = [
8
- SearchVolumeCountriesDisciplinesRule.getInstance()
9
- ];
10
7
  constructor(dependencies) {
11
8
  super(dependencies);
12
9
  }
@@ -21,12 +18,7 @@ export class DisciplineCountryPolicy extends RuleBasedIndexabilityPolicy {
21
18
  FilterKey.DISCIPLINES,
22
19
  FilterKey.COUNTRY
23
20
  ], filterState);
24
- const countrySelected = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
25
- const disciplineSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.DISCIPLINES, filterState);
26
- const hasSearchVolume = this.checksEveryRuleForSearch({
27
- [FilterKey.COUNTRY]: countrySelected ?? undefined,
28
- [FilterKey.DISCIPLINES]: disciplineSelected ?? undefined
29
- });
21
+ const hasSearchVolume = this.checksRulesForSearch(this.dependencies);
30
22
  return singleDisciplineSelected
31
23
  && singleCountrySelected
32
24
  && onlyDisciplineAndCountrySelected
@@ -38,7 +30,7 @@ export class DisciplineCountryPolicy extends RuleBasedIndexabilityPolicy {
38
30
  const disciplineFragments = CountryPresenter.getInstance().getFragments();
39
31
  countryFragments.forEach(country => {
40
32
  disciplineFragments.forEach(discipline => {
41
- if (this.checksEveryRuleForSitemap({
33
+ if (this.checksRulesForSitemap({
42
34
  [FilterKey.COUNTRY]: country.id,
43
35
  [FilterKey.DISCIPLINES]: discipline.id
44
36
  })) {
@@ -51,4 +43,19 @@ export class DisciplineCountryPolicy extends RuleBasedIndexabilityPolicy {
51
43
  get filterCombination() {
52
44
  return FilterCombinations.DISCIPLINE_COUNTRY;
53
45
  }
46
+ checksRulesForSearch(dependencies) {
47
+ const { seoInfoBase, filterState } = dependencies;
48
+ const countrySelected = seoInfoBase.getFilterOptionValueBy(FilterKey.COUNTRY, filterState);
49
+ const disciplineSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.DISCIPLINES, filterState);
50
+ const searchVolumeRule = SearchVolumeCountriesDisciplinesRule.getInstance();
51
+ const hasSearchVolume = searchVolumeRule.forSearch({
52
+ [FilterKey.COUNTRY]: countrySelected ?? undefined,
53
+ [FilterKey.DISCIPLINES]: disciplineSelected ?? undefined
54
+ });
55
+ return hasSearchVolume;
56
+ }
57
+ checksRulesForSitemap(filters) {
58
+ const searchVolumeRule = SearchVolumeCountriesDisciplinesRule.getInstance();
59
+ return searchVolumeRule.forSitemapGenerator(filters);
60
+ }
54
61
  }
@@ -1,12 +1,14 @@
1
1
  import { SeoDependencies } from '../../types/SeoDependencies';
2
- import { ICustomRule } from '../../common/ICustomRule';
2
+ import { ISearchDependencies } from '../../common/ISearchDependencies';
3
3
  import { ISeoIndexabilityPolicy } from '../../common/ISeoIndexabilityPolicy';
4
4
  import { FilterCombinations } from '../../enums/FilterCombinations';
5
5
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
6
+ import { IFilterKeyValues } from '../../common/IFilterKeyValues';
6
7
  export declare class DisciplinePolicy extends RuleBasedIndexabilityPolicy implements ISeoIndexabilityPolicy {
7
- protected rules: ICustomRule[];
8
8
  constructor(dependencies: SeoDependencies);
9
9
  protected matchesFilters(): Promise<boolean>;
10
10
  generateUrls(): Promise<string[]>;
11
11
  get filterCombination(): FilterCombinations;
12
+ protected checksRulesForSearch(dependencies: ISearchDependencies): boolean;
13
+ protected checksRulesForSitemap(filters: IFilterKeyValues): boolean;
12
14
  }
@@ -4,12 +4,8 @@ import { SearchVolumeDisciplinesRule } from '../../scholarships/rules/SearchVolu
4
4
  import { FilterCombinations } from '../../enums/FilterCombinations';
5
5
  import { RuleBasedIndexabilityPolicy } from '../../common/RuleBasedIndexabilityPolicy';
6
6
  export class DisciplinePolicy extends RuleBasedIndexabilityPolicy {
7
- rules;
8
7
  constructor(dependencies) {
9
8
  super(dependencies);
10
- this.rules = [
11
- SearchVolumeDisciplinesRule.getInstance(),
12
- ];
13
9
  }
14
10
  async matchesFilters() {
15
11
  const { seoInfoBase, filterState } = this.dependencies;
@@ -17,10 +13,7 @@ export class DisciplinePolicy extends RuleBasedIndexabilityPolicy {
17
13
  const onlyDisciplineSelected = await seoInfoBase.selectionOnlyFor([
18
14
  FilterKey.DISCIPLINES
19
15
  ], filterState);
20
- const disciplineSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.DISCIPLINES, filterState);
21
- const hasSearchVolume = this.checksEveryRuleForSearch({
22
- [FilterKey.DISCIPLINES]: disciplineSelected ?? undefined
23
- });
16
+ const hasSearchVolume = this.checksRulesForSearch(this.dependencies);
24
17
  return singleDisciplineSelected
25
18
  && onlyDisciplineSelected
26
19
  && hasSearchVolume;
@@ -28,7 +21,7 @@ export class DisciplinePolicy extends RuleBasedIndexabilityPolicy {
28
21
  generateUrls() {
29
22
  const disciplineFragments = DisciplinePresenter.getInstance().getFragments();
30
23
  const paths = disciplineFragments
31
- .filter(discipline => this.checksEveryRuleForSitemap({
24
+ .filter(discipline => this.checksRulesForSitemap({
32
25
  [FilterKey.DISCIPLINES]: discipline.id
33
26
  }))
34
27
  .map(discipline => discipline.path);
@@ -37,4 +30,17 @@ export class DisciplinePolicy extends RuleBasedIndexabilityPolicy {
37
30
  get filterCombination() {
38
31
  return FilterCombinations.DISCIPLINE;
39
32
  }
33
+ checksRulesForSearch(dependencies) {
34
+ const { seoInfoBase, filterState } = dependencies;
35
+ const hasSearchVolumeRule = SearchVolumeDisciplinesRule.getInstance();
36
+ const disciplineSelected = seoInfoBase.getFilterOptionValueBy(FilterKey.DISCIPLINES, filterState);
37
+ const hasSearchVolume = hasSearchVolumeRule.forSearch({
38
+ [FilterKey.DISCIPLINES]: disciplineSelected ?? undefined
39
+ });
40
+ return hasSearchVolume;
41
+ }
42
+ checksRulesForSitemap(filters) {
43
+ const hasSearchVolumeRule = SearchVolumeDisciplinesRule.getInstance();
44
+ return hasSearchVolumeRule.forSitemapGenerator(filters);
45
+ }
40
46
  }
@@ -0,0 +1,7 @@
1
+ import { IDependencies } from "../common/IDependencies";
2
+ import { ISearchApiClient } from "./ISearchApiClient";
3
+ import { IOrganisationsClient } from "./IOrganisationsClient";
4
+ export interface ISitemapDependencies extends IDependencies {
5
+ searchApiClient?: ISearchApiClient;
6
+ organisationsClient?: IOrganisationsClient;
7
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -1,3 +1,3 @@
1
- import { IIndexabilityPolicyDependencies } from "../common/IIndexabilityPolicyDependencies";
2
- import { ISitemapUrlGeneratorDependencies } from "../sitemap-generator/ISitemapUrlGeneratorDependencies";
3
- export type SeoDependencies = IIndexabilityPolicyDependencies | ISitemapUrlGeneratorDependencies;
1
+ import { ISearchDependencies } from "../common/ISearchDependencies";
2
+ import { ISitemapDependencies } from "../sitemap-generator/ISitemapDependencies";
3
+ export type SeoDependencies = ISearchDependencies | ISitemapDependencies;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@studyportals/fawkes",
3
- "version": "2.0.1-24",
3
+ "version": "2.0.1-25",
4
4
  "description": "A package to centralize SEO related logic for SBLP and Sitemap Generator.",
5
5
  "files": [
6
6
  "./dist"