@sumaris-net/ngx-components 18.14.15 → 18.14.17

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 (27) hide show
  1. package/doc/changelog.md +462 -128
  2. package/doc/feed/feed-fr.json +8 -6
  3. package/esm2022/public_api.mjs +4 -4
  4. package/esm2022/src/app/shared/pipes/arrays.pipe.mjs +14 -1
  5. package/esm2022/src/app/shared/pipes/pipes.module.mjs +5 -2
  6. package/esm2022/src/app/social/feed/feed.component.mjs +3 -4
  7. package/esm2022/src/app/social/feed/feed.directive.mjs +4 -4
  8. package/esm2022/src/app/social/feed/feed.service.mjs +158 -2
  9. package/esm2022/src/app/social/message/message.form.mjs +4 -3
  10. package/esm2022/src/app/social/message/message.model.mjs +2 -2
  11. package/esm2022/src/environments/environment.mjs +4 -2
  12. package/fesm2022/sumaris-net.ngx-components.mjs +156 -312
  13. package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
  14. package/package.json +1 -1
  15. package/public_api.d.ts +0 -3
  16. package/src/app/shared/inputs.d.ts +1 -1
  17. package/src/app/shared/pipes/arrays.pipe.d.ts +5 -0
  18. package/src/app/shared/pipes/pipes.module.d.ts +1 -1
  19. package/src/app/social/feed/feed.directive.d.ts +1 -1
  20. package/src/app/social/feed/feed.service.d.ts +57 -0
  21. package/src/assets/manifest.json +1 -1
  22. package/esm2022/src/app/social/feed/discourse/discourse-feed.service.mjs +0 -170
  23. package/esm2022/src/app/social/feed/discourse/discourse.model.mjs +0 -2
  24. package/esm2022/src/app/social/feed/discourse/discourse.utils.mjs +0 -168
  25. package/src/app/social/feed/discourse/discourse-feed.service.d.ts +0 -56
  26. package/src/app/social/feed/discourse/discourse.model.d.ts +0 -7
  27. package/src/app/social/feed/discourse/discourse.utils.d.ts +0 -44
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@sumaris-net/ngx-components",
3
3
  "description": "SUMARiS Angular components",
4
- "version": "18.14.15",
4
+ "version": "18.14.17",
5
5
  "author": "contact@e-is.pro",
6
6
  "license": "AGPL-3.0",
7
7
  "readmeFilename": "README.md",
package/public_api.d.ts CHANGED
@@ -287,9 +287,6 @@ export * from './src/app/social/feed/feed.service';
287
287
  export * from './src/app/social/feed/feed.model';
288
288
  export * from './src/app/social/feed/feed.directive';
289
289
  export * from './src/app/social/feed/feed.module';
290
- export * from './src/app/social/feed/discourse/discourse-feed.service';
291
- export * from './src/app/social/feed/discourse/discourse.utils';
292
- export * from './src/app/social/feed/discourse/discourse.model';
293
290
  export * from './src/app/admin/admin.module';
294
291
  export { AdminRoutingModule } from './src/app/admin/admin-routing.module';
295
292
  export * from './src/app/admin/services/filter/person.filter';
@@ -17,7 +17,7 @@ export interface InputElement extends FocusableElement {
17
17
  }
18
18
  export declare function isInputElement(object: any): object is InputElement;
19
19
  export declare function asInputElement<T = any>(object: ElementRef<T>): InputElement | undefined;
20
- export declare function tabindexComparator(a: InputElement, b: InputElement): 1 | -1 | 0;
20
+ export declare function tabindexComparator(a: InputElement, b: InputElement): 0 | 1 | -1;
21
21
  export interface CanGainFocusOptions {
22
22
  minTabindex?: number;
23
23
  maxTabindex?: number;
@@ -80,3 +80,8 @@ export declare class SplitArrayInChunksPipe implements PipeTransform {
80
80
  static ɵfac: i0.ɵɵFactoryDeclaration<SplitArrayInChunksPipe, never>;
81
81
  static ɵpipe: i0.ɵɵPipeDeclaration<SplitArrayInChunksPipe, "splitArrayInChunks", false>;
82
82
  }
83
+ export declare class ArrayMapPipe implements PipeTransform {
84
+ transform<T, R>(value: T, mapFn: (value: T) => R, ...otherArguments: any[]): R;
85
+ static ɵfac: i0.ɵɵFactoryDeclaration<ArrayMapPipe, never>;
86
+ static ɵpipe: i0.ɵɵPipeDeclaration<ArrayMapPipe, "arrayMap", false>;
87
+ }
@@ -30,6 +30,6 @@ import * as i28 from "@ionic/angular";
30
30
  import * as i29 from "@ngx-translate/core";
31
31
  export declare class SharedPipesModule {
32
32
  static ɵfac: i0.ɵɵFactoryDeclaration<SharedPipesModule, never>;
33
- static ɵmod: i0.ɵɵNgModuleDeclaration<SharedPipesModule, [typeof i1.PropertyGetPipe, typeof i1.PropertyFormatPipe, typeof i1.ValueFormatPipe, typeof i2.DateFormatPipe, typeof i3.DateDiffDurationPipe, typeof i4.DurationPipe, typeof i5.DateFromNowPipe, typeof i6.LatLongFormatPipe, typeof i6.LatitudeFormatPipe, typeof i6.LongitudeFormatPipe, typeof i7.HighlightPipe, typeof i8.NumberFormatPipe, typeof i9.FileSizePipe, typeof i10.MathAbsPipe, typeof i10.OddPipe, typeof i10.EvenPipe, typeof i10.RoundPipe, typeof i11.NotEmptyArrayPipe, typeof i11.EmptyArrayPipe, typeof i11.ArrayLengthPipe, typeof i11.ArrayFirstPipe, typeof i11.ArrayLastPipe, typeof i11.ArrayPluckPipe, typeof i11.ArrayIncludesPipe, typeof i11.ArrayFilterPipe, typeof i11.ArrayJoinPipe, typeof i11.ArrayDistinctPipe, typeof i11.ArrayFindByPropertyPipe, typeof i11.SplitArrayInChunksPipe, typeof i12.MapGetPipe, typeof i12.MapKeysPipe, typeof i12.MapValuesPipe, typeof i13.IsNilOrBlankPipe, typeof i13.IsNotNilOrBlankPipe, typeof i13.IsNilOrNaNPipe, typeof i13.IsNotNilOrNaNPipe, typeof i13.IsNotNilPipe, typeof i13.IsNilPipe, typeof i14.IsValidDatePipe, typeof i13.ToStringPipe, typeof i13.CapitalizePipe, typeof i13.StrLengthPipe, typeof i13.StrIncludesPipe, typeof i13.StrReplacePipe, typeof i13.TruncHtmlPipe, typeof i13.TruncTextPipe, typeof i15.AppendQueryParamsPipePipe, typeof i1.BooleanFormatPipe, typeof i16.TranslateContextPipe, typeof i16.TranslatablePipe, typeof i17.NgInitDirective, typeof i18.FormErrorPipe, typeof i18.FormErrorTranslatePipe, typeof i18.FormGetPipe, typeof i18.FormGetControlPipe, typeof i18.FormGetArrayPipe, typeof i18.FormGetGroupPipe, typeof i18.FormGetValuePipe, typeof i19.MatColorPipe, typeof i20.AsAnyPipe, typeof i20.AsArrayPipe, typeof i20.AsObservablePipe, typeof i20.AsFloatLabelTypePipe, typeof i21.MaskitoPlaceholderPipe, typeof i22.IsSelectedPipe, typeof i22.IsNotEmptySelectionPipe, typeof i22.IsEmptySelectionPipe, typeof i22.SelectionLengthPipe, typeof i22.IsMultipleSelectionPipe, typeof i22.IsSingleSelectionPipe, typeof i23.BadgeNumberPipe, typeof i20.AsBooleanPipe, typeof i24.SafeHtmlPipe, typeof i24.SafeStylePipe, typeof i24.NoHtmlPipe, typeof i25.DisplayWithPipe, typeof i26.FirstTruePipe, typeof i26.FirstFalsePipe, typeof i26.FirstPipe, typeof i26.MapPipe], [typeof i27.CommonModule, typeof i28.IonicModule, typeof i29.TranslateModule], [typeof i1.PropertyGetPipe, typeof i1.PropertyFormatPipe, typeof i1.ValueFormatPipe, typeof i2.DateFormatPipe, typeof i3.DateDiffDurationPipe, typeof i4.DurationPipe, typeof i5.DateFromNowPipe, typeof i6.LatLongFormatPipe, typeof i6.LatitudeFormatPipe, typeof i6.LongitudeFormatPipe, typeof i7.HighlightPipe, typeof i8.NumberFormatPipe, typeof i9.FileSizePipe, typeof i10.MathAbsPipe, typeof i10.OddPipe, typeof i10.EvenPipe, typeof i10.RoundPipe, typeof i11.NotEmptyArrayPipe, typeof i11.EmptyArrayPipe, typeof i11.ArrayLengthPipe, typeof i11.ArrayFirstPipe, typeof i11.ArrayLastPipe, typeof i11.ArrayPluckPipe, typeof i11.ArrayIncludesPipe, typeof i11.ArrayFilterPipe, typeof i11.ArrayJoinPipe, typeof i11.ArrayDistinctPipe, typeof i11.ArrayFindByPropertyPipe, typeof i11.SplitArrayInChunksPipe, typeof i12.MapGetPipe, typeof i12.MapKeysPipe, typeof i12.MapValuesPipe, typeof i13.IsNilOrBlankPipe, typeof i13.IsNotNilOrBlankPipe, typeof i13.IsNilOrNaNPipe, typeof i13.IsNotNilOrNaNPipe, typeof i13.IsNotNilPipe, typeof i13.IsNilPipe, typeof i14.IsValidDatePipe, typeof i13.ToStringPipe, typeof i13.CapitalizePipe, typeof i13.StrLengthPipe, typeof i13.StrIncludesPipe, typeof i13.StrReplacePipe, typeof i13.TruncHtmlPipe, typeof i13.TruncTextPipe, typeof i15.AppendQueryParamsPipePipe, typeof i1.BooleanFormatPipe, typeof i16.TranslateContextPipe, typeof i16.TranslatablePipe, typeof i17.NgInitDirective, typeof i18.FormErrorPipe, typeof i18.FormErrorTranslatePipe, typeof i18.FormGetPipe, typeof i18.FormGetControlPipe, typeof i18.FormGetArrayPipe, typeof i18.FormGetGroupPipe, typeof i18.FormGetValuePipe, typeof i19.MatColorPipe, typeof i20.AsAnyPipe, typeof i20.AsArrayPipe, typeof i20.AsObservablePipe, typeof i20.AsFloatLabelTypePipe, typeof i21.MaskitoPlaceholderPipe, typeof i22.IsSelectedPipe, typeof i22.IsNotEmptySelectionPipe, typeof i22.IsEmptySelectionPipe, typeof i22.SelectionLengthPipe, typeof i22.IsMultipleSelectionPipe, typeof i22.IsSingleSelectionPipe, typeof i23.BadgeNumberPipe, typeof i20.AsBooleanPipe, typeof i24.SafeHtmlPipe, typeof i24.SafeStylePipe, typeof i24.NoHtmlPipe, typeof i25.DisplayWithPipe, typeof i26.FirstTruePipe, typeof i26.FirstFalsePipe, typeof i26.FirstPipe, typeof i26.MapPipe]>;
33
+ static ɵmod: i0.ɵɵNgModuleDeclaration<SharedPipesModule, [typeof i1.PropertyGetPipe, typeof i1.PropertyFormatPipe, typeof i1.ValueFormatPipe, typeof i2.DateFormatPipe, typeof i3.DateDiffDurationPipe, typeof i4.DurationPipe, typeof i5.DateFromNowPipe, typeof i6.LatLongFormatPipe, typeof i6.LatitudeFormatPipe, typeof i6.LongitudeFormatPipe, typeof i7.HighlightPipe, typeof i8.NumberFormatPipe, typeof i9.FileSizePipe, typeof i10.MathAbsPipe, typeof i10.OddPipe, typeof i10.EvenPipe, typeof i10.RoundPipe, typeof i11.NotEmptyArrayPipe, typeof i11.EmptyArrayPipe, typeof i11.ArrayLengthPipe, typeof i11.ArrayFirstPipe, typeof i11.ArrayLastPipe, typeof i11.ArrayPluckPipe, typeof i11.ArrayIncludesPipe, typeof i11.ArrayFilterPipe, typeof i11.ArrayJoinPipe, typeof i11.ArrayDistinctPipe, typeof i11.ArrayFindByPropertyPipe, typeof i11.SplitArrayInChunksPipe, typeof i11.ArrayMapPipe, typeof i12.MapGetPipe, typeof i12.MapKeysPipe, typeof i12.MapValuesPipe, typeof i13.IsNilOrBlankPipe, typeof i13.IsNotNilOrBlankPipe, typeof i13.IsNilOrNaNPipe, typeof i13.IsNotNilOrNaNPipe, typeof i13.IsNotNilPipe, typeof i13.IsNilPipe, typeof i14.IsValidDatePipe, typeof i13.ToStringPipe, typeof i13.CapitalizePipe, typeof i13.StrLengthPipe, typeof i13.StrIncludesPipe, typeof i13.StrReplacePipe, typeof i13.TruncHtmlPipe, typeof i13.TruncTextPipe, typeof i15.AppendQueryParamsPipePipe, typeof i1.BooleanFormatPipe, typeof i16.TranslateContextPipe, typeof i16.TranslatablePipe, typeof i17.NgInitDirective, typeof i18.FormErrorPipe, typeof i18.FormErrorTranslatePipe, typeof i18.FormGetPipe, typeof i18.FormGetControlPipe, typeof i18.FormGetArrayPipe, typeof i18.FormGetGroupPipe, typeof i18.FormGetValuePipe, typeof i19.MatColorPipe, typeof i20.AsAnyPipe, typeof i20.AsArrayPipe, typeof i20.AsObservablePipe, typeof i20.AsFloatLabelTypePipe, typeof i21.MaskitoPlaceholderPipe, typeof i22.IsSelectedPipe, typeof i22.IsNotEmptySelectionPipe, typeof i22.IsEmptySelectionPipe, typeof i22.SelectionLengthPipe, typeof i22.IsMultipleSelectionPipe, typeof i22.IsSingleSelectionPipe, typeof i23.BadgeNumberPipe, typeof i20.AsBooleanPipe, typeof i24.SafeHtmlPipe, typeof i24.SafeStylePipe, typeof i24.NoHtmlPipe, typeof i25.DisplayWithPipe, typeof i26.FirstTruePipe, typeof i26.FirstFalsePipe, typeof i26.FirstPipe, typeof i26.MapPipe], [typeof i27.CommonModule, typeof i28.IonicModule, typeof i29.TranslateModule], [typeof i1.PropertyGetPipe, typeof i1.PropertyFormatPipe, typeof i1.ValueFormatPipe, typeof i2.DateFormatPipe, typeof i3.DateDiffDurationPipe, typeof i4.DurationPipe, typeof i5.DateFromNowPipe, typeof i6.LatLongFormatPipe, typeof i6.LatitudeFormatPipe, typeof i6.LongitudeFormatPipe, typeof i7.HighlightPipe, typeof i8.NumberFormatPipe, typeof i9.FileSizePipe, typeof i10.MathAbsPipe, typeof i10.OddPipe, typeof i10.EvenPipe, typeof i10.RoundPipe, typeof i11.NotEmptyArrayPipe, typeof i11.EmptyArrayPipe, typeof i11.ArrayLengthPipe, typeof i11.ArrayFirstPipe, typeof i11.ArrayLastPipe, typeof i11.ArrayPluckPipe, typeof i11.ArrayIncludesPipe, typeof i11.ArrayFilterPipe, typeof i11.ArrayJoinPipe, typeof i11.ArrayDistinctPipe, typeof i11.ArrayFindByPropertyPipe, typeof i11.SplitArrayInChunksPipe, typeof i11.ArrayMapPipe, typeof i12.MapGetPipe, typeof i12.MapKeysPipe, typeof i12.MapValuesPipe, typeof i13.IsNilOrBlankPipe, typeof i13.IsNotNilOrBlankPipe, typeof i13.IsNilOrNaNPipe, typeof i13.IsNotNilOrNaNPipe, typeof i13.IsNotNilPipe, typeof i13.IsNilPipe, typeof i14.IsValidDatePipe, typeof i13.ToStringPipe, typeof i13.CapitalizePipe, typeof i13.StrLengthPipe, typeof i13.StrIncludesPipe, typeof i13.StrReplacePipe, typeof i13.TruncHtmlPipe, typeof i13.TruncTextPipe, typeof i15.AppendQueryParamsPipePipe, typeof i1.BooleanFormatPipe, typeof i16.TranslateContextPipe, typeof i16.TranslatablePipe, typeof i17.NgInitDirective, typeof i18.FormErrorPipe, typeof i18.FormErrorTranslatePipe, typeof i18.FormGetPipe, typeof i18.FormGetControlPipe, typeof i18.FormGetArrayPipe, typeof i18.FormGetGroupPipe, typeof i18.FormGetValuePipe, typeof i19.MatColorPipe, typeof i20.AsAnyPipe, typeof i20.AsArrayPipe, typeof i20.AsObservablePipe, typeof i20.AsFloatLabelTypePipe, typeof i21.MaskitoPlaceholderPipe, typeof i22.IsSelectedPipe, typeof i22.IsNotEmptySelectionPipe, typeof i22.IsEmptySelectionPipe, typeof i22.SelectionLengthPipe, typeof i22.IsMultipleSelectionPipe, typeof i22.IsSingleSelectionPipe, typeof i23.BadgeNumberPipe, typeof i20.AsBooleanPipe, typeof i24.SafeHtmlPipe, typeof i24.SafeStylePipe, typeof i24.NoHtmlPipe, typeof i25.DisplayWithPipe, typeof i26.FirstTruePipe, typeof i26.FirstFalsePipe, typeof i26.FirstPipe, typeof i26.MapPipe]>;
34
34
  static ɵinj: i0.ɵɵInjectorDeclaration<SharedPipesModule>;
35
35
  }
@@ -28,5 +28,5 @@ export declare class FeedDirective implements AfterViewInit, OnDestroy {
28
28
  normalizeUrl(url: string): string;
29
29
  getUrlTree(url: string): UrlTree;
30
30
  static ɵfac: i0.ɵɵFactoryDeclaration<FeedDirective, never>;
31
- static ɵdir: i0.ɵɵDirectiveDeclaration<FeedDirective, "feed,[feed]", never, { "feedUrl": { "alias": "feed"; "required": false; }; }, {}, never, never, false, never>;
31
+ static ɵdir: i0.ɵɵDirectiveDeclaration<FeedDirective, "feed,[feed]", never, { "feedUrl": { "alias": "feed"; "required": true; }; }, {}, never, never, false, never>;
32
32
  }
@@ -2,6 +2,12 @@ import { Observable } from 'rxjs';
2
2
  import { LoadResult } from '../../shared/services/entity-service.class';
3
3
  import { JsonFeed } from './feed.model';
4
4
  import { InjectionToken } from '@angular/core';
5
+ import { StartableService } from '../../shared/services/startable-service.class';
6
+ import { NetworkService } from '../../core/services/network.service';
7
+ import { LocalSettingsService } from '../../core/services/local-settings.service';
8
+ import { RxState } from '@rx-angular/state';
9
+ import { Environment } from '../../../environments/environment.class';
10
+ import * as i0 from "@angular/core";
5
11
  export declare const APP_FEED_SERVICE: InjectionToken<IFeedService<any>>;
6
12
  export interface IFeedService<T extends JsonFeed = JsonFeed> {
7
13
  watchAll(opts?: {
@@ -12,3 +18,54 @@ export interface IFeedService<T extends JsonFeed = JsonFeed> {
12
18
  getHomeUrl(feed?: T): string;
13
19
  getTagUrl(feed: T, tag: string): string;
14
20
  }
21
+ export interface FeedServiceState {
22
+ locale: string;
23
+ feedUrls?: string[];
24
+ }
25
+ export declare class FeedService<S extends FeedServiceState> extends StartableService<S> implements IFeedService {
26
+ private settings;
27
+ protected environment: Environment;
28
+ protected _logPrefix: string;
29
+ protected _state: RxState<S>;
30
+ protected network: NetworkService;
31
+ locale$: Observable<S["locale"]>;
32
+ feedUrls$: Observable<S["feedUrls"]>;
33
+ get feedUrls(): string[];
34
+ set feedUrls(urls: string[]);
35
+ constructor(settings: LocalSettingsService, environment: Environment);
36
+ protected ngOnStart(): Promise<S>;
37
+ watchAll(opts?: {
38
+ urls?: string[];
39
+ maxAgeInMonths?: number;
40
+ maxContentLength?: number;
41
+ }): Observable<LoadResult<JsonFeed>>;
42
+ getHomeUrl(feed?: JsonFeed): string;
43
+ getTagUrl(feed: JsonFeed, tag: string): string;
44
+ load(url: string, opts?: {
45
+ locale?: string;
46
+ maxAgeInMonths?: number;
47
+ maxContentLength?: number;
48
+ depth?: number;
49
+ }): Promise<JsonFeed>;
50
+ loadAll(urls?: string[], opts?: {
51
+ locale?: string;
52
+ maxAgeInMonths?: number;
53
+ maxContentLength?: number;
54
+ depth?: number;
55
+ [key: string]: any;
56
+ }): Promise<LoadResult<JsonFeed>>;
57
+ protected resolveFeed(json: any, url: string, opts?: {
58
+ locale?: string;
59
+ maxAgeInMonths?: number;
60
+ maxContentLength?: number;
61
+ depth?: number;
62
+ [key: string]: any;
63
+ }): Promise<JsonFeed[]>;
64
+ protected resolveFeedItems(json: JsonFeed, opts?: {
65
+ maxContentLength?: number;
66
+ depth?: number;
67
+ }): Promise<JsonFeed>;
68
+ protected onAfterLoadAll(): void;
69
+ static ɵfac: i0.ɵɵFactoryDeclaration<FeedService<any>, [null, { optional: true; }]>;
70
+ static ɵprov: i0.ɵɵInjectableDeclaration<FeedService<any>>;
71
+ }
@@ -2,7 +2,7 @@
2
2
  "name": "ngx-sumaris-components",
3
3
  "short_name": "ngx-sumaris-components",
4
4
  "manifest_version": 1,
5
- "version": "18.14.15",
5
+ "version": "18.14.17",
6
6
  "default_locale": "fr",
7
7
  "description": "Angular components for building beautiful and responsive Apps",
8
8
  "icons": [{
@@ -1,170 +0,0 @@
1
- import { Inject, inject, Injectable, Optional } from '@angular/core';
2
- import { Promise } from '@rx-angular/cdk/zone-less/browser';
3
- import { DiscourseUtils } from './discourse.utils';
4
- import DiscourseAPI from 'discourse2';
5
- import { JsonFeedUtils } from '../feed.model';
6
- import { firstArrayValue, isEmptyArray, isNotEmptyArray, isNotNilOrBlank } from '../../../shared/functions';
7
- import { from, switchMap } from 'rxjs';
8
- import { filter, map, mergeMap } from 'rxjs/operators';
9
- import { StartableService } from '../../../shared/services/startable-service.class';
10
- import { NetworkService } from '../../../core/services/network.service';
11
- import { RxState } from '@rx-angular/state';
12
- import { ENVIRONMENT } from '../../../../environments/environment.class';
13
- import { UrlUtils } from '../../../shared/file/url.utils';
14
- import * as i0 from "@angular/core";
15
- import * as i1 from "../../../core/services/local-settings.service";
16
- import * as i2 from "../../../../environments/environment.class";
17
- export class DiscourseFeedService extends StartableService {
18
- settings;
19
- environment;
20
- discourseApis = new Map();
21
- _logPrefix = '[discourse-feed-service] ';
22
- _state = new RxState();
23
- network = inject(NetworkService);
24
- locale$ = this._state.select('locale');
25
- feedUrls$ = this._state.select('feedUrls');
26
- get feedUrls() {
27
- return this._state.get('feedUrls');
28
- }
29
- set feedUrls(urls) {
30
- this._state.set('feedUrls', () => urls);
31
- }
32
- constructor(settings, environment) {
33
- super(settings);
34
- this.settings = settings;
35
- this.environment = environment;
36
- this._debug = !environment.production;
37
- if (this._debug)
38
- console.debug('[discourse-feed-service] Creating service');
39
- this._state.connect('locale', this.settings.locale$);
40
- this._state.connect('feedUrls', this.locale$.pipe(filter(isNotNilOrBlank), map((locale) => (locale && environment.feed?.jsonFeed?.[locale]) ?? [])));
41
- }
42
- async ngOnStart() {
43
- await this.settings.ready();
44
- return {
45
- locale: this.settings.locale,
46
- };
47
- }
48
- watchAll(opts) {
49
- if (!this.started) {
50
- return from(this.start()).pipe(switchMap(() => this.watchAll(opts)));
51
- }
52
- if (isNotEmptyArray(opts?.urls)) {
53
- return this.locale$.pipe(mergeMap((locale) => this.loadAll(opts.urls, { locale, ...opts })));
54
- }
55
- return this.feedUrls$.pipe(filter(isNotEmptyArray), mergeMap((urls) => this.loadAll(urls, opts)));
56
- }
57
- getHomeUrl(feed) {
58
- const feedUrl = feed?.feed_url ?? firstArrayValue(this.feedUrls);
59
- return feedUrl ? UrlUtils.getRootUrl(feedUrl) : undefined;
60
- }
61
- getTagUrl(feed, tag) {
62
- if (!feed || !tag)
63
- throw new Error("Missing 'feed' or 'tag' argument");
64
- const baseUrl = this.getHomeUrl(feed);
65
- return feed.tag_template?.replace('{tag}', tag) ?? baseUrl + '/tag/' + tag;
66
- }
67
- async load(url, opts) {
68
- const { data } = await this.loadAll([url], opts);
69
- return data?.[0];
70
- }
71
- async loadAll(urls, opts) {
72
- await this.ready();
73
- urls = urls ?? this.feedUrls;
74
- opts = {
75
- maxAgeInMonths: opts?.maxAgeInMonths ?? this.environment.feed?.maxAgeInMonths,
76
- maxContentLength: opts?.maxContentLength ?? this.environment.feed?.maxContentLength,
77
- locale: this.settings.locale,
78
- depth: 0,
79
- closeApis: true,
80
- ...opts,
81
- };
82
- const feeds = await Promise.all((urls || []).map(async (url) => {
83
- try {
84
- // Get JSON
85
- const json = await this.network.fetch(url);
86
- console.debug(`${this._logPrefix}Loaded JSON from ${url}`, json);
87
- if (JsonFeedUtils.isJsonFeed(json)) {
88
- // Migrate old version
89
- let feed = JsonFeedUtils.migrateFeed(json);
90
- // Resolve items (e.g. using feed.next_url)
91
- feed = await this.resolveFeedItems(feed, { ...opts, depth: opts?.depth ?? 0 });
92
- // Truncate html
93
- JsonFeedUtils.truncateFeedItemsHtml(feed, opts);
94
- return isNotEmptyArray(feed?.items) ? [feed] : [];
95
- }
96
- // Get discourse
97
- if (DiscourseUtils.isDiscourseObject(json)) {
98
- const api = this.getOrCreateDiscourseApi(url);
99
- return await DiscourseUtils.getFeedsByUrl(url, { ...opts, api });
100
- }
101
- return undefined;
102
- }
103
- catch (err) {
104
- if (err?.status === 404) {
105
- console.error(`${this._logPrefix} Error while fetching feed at ${url}. 404 (Not found)`);
106
- }
107
- else {
108
- console.error(`${this._logPrefix} Error while fetching feed at ${url}`, err);
109
- }
110
- return Promise.resolve([]);
111
- }
112
- }));
113
- if (opts?.closeApis !== false) {
114
- this.closeApis();
115
- }
116
- const data = feeds.flat();
117
- return { data, total: data.length };
118
- }
119
- getOrCreateDiscourseApi(url) {
120
- const baseUrl = DiscourseUtils.getDiscourseBaseUrl(url);
121
- let api = this.discourseApis.get(baseUrl);
122
- if (!api) {
123
- api = new DiscourseAPI(baseUrl);
124
- this.discourseApis.set(baseUrl, api);
125
- }
126
- return api;
127
- }
128
- closeApis() {
129
- this.discourseApis.clear();
130
- }
131
- async resolveFeedItems(json, opts) {
132
- if (!json)
133
- return json;
134
- // Load items
135
- if (isEmptyArray(json.items) && isNotNilOrBlank(json.next_url)) {
136
- const depth = opts?.depth ?? 0;
137
- if (depth >= 3) {
138
- console.warn(`${this._logPrefix}Max depth reached (${depth}) for ${json.feed_url}`);
139
- return json;
140
- }
141
- // Load items
142
- const feed = await this.load(json.next_url, { ...opts, closeApis: false, depth: depth + 1 });
143
- if (isEmptyArray(feed?.items)) {
144
- return json;
145
- }
146
- // Merge with the input json
147
- return {
148
- ...json,
149
- title: json.title ?? feed.title,
150
- home_page_url: json.home_page_url ?? feed.home_page_url,
151
- authors: isNotEmptyArray(json.authors) ? json.authors : feed.authors,
152
- items: feed.items,
153
- tag_template: json.tag_template ?? feed.tag_template,
154
- };
155
- }
156
- return json;
157
- }
158
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, deps: [{ token: i1.LocalSettingsService }, { token: ENVIRONMENT, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
159
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, providedIn: 'root' });
160
- }
161
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DiscourseFeedService, decorators: [{
162
- type: Injectable,
163
- args: [{ providedIn: 'root' }]
164
- }], ctorParameters: () => [{ type: i1.LocalSettingsService }, { type: i2.Environment, decorators: [{
165
- type: Optional
166
- }, {
167
- type: Inject,
168
- args: [ENVIRONMENT]
169
- }] }] });
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLWZlZWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvZGlzY291cnNlL2Rpc2NvdXJzZS1mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sWUFBWSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsSUFBSSxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFTMUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUEyQztJQW1CekU7SUFDbUM7SUFuQnJDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJ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YUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZELE9BQU8sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDcEUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTthQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0F6TVUsb0JBQW9CLHNEQW9CVCxXQUFXOzRHQXBCdEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXFCN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBpbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgRGlzY291cnNlVXRpbHMgfSBmcm9tICcuL2Rpc2NvdXJzZS51dGlscyc7XG5pbXBvcnQgRGlzY291cnNlQVBJIGZyb20gJ2Rpc2NvdXJzZTInO1xuaW1wb3J0IHsgSnNvbkZlZWQsIEpzb25GZWVkVXRpbHMgfSBmcm9tICcuLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IGZpcnN0QXJyYXlWYWx1ZSwgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ZpbGUvdXJsLnV0aWxzJztcbmltcG9ydCB7IElGZWVkU2VydmljZSB9IGZyb20gJy4uL2ZlZWQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZSB7XG4gIGxvY2FsZTogc3RyaW5nO1xuICBmZWVkVXJscz86IHN0cmluZ1tdO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERpc2NvdXJzZUZlZWRTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZTxEaXNjb3Vyc2VGZWVkU2VydmljZVN0YXRlPiBpbXBsZW1lbnRzIElGZWVkU2VydmljZSB7XG4gIHByaXZhdGUgZGlzY291cnNlQXBpcyA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3Vyc2VBUEk+KCk7XG4gIHByaXZhdGUgX2xvZ1ByZWZpeCA9ICdbZGlzY291cnNlLWZlZWQtc2VydmljZV0gJztcblxuICBwcml2YXRlIF9zdGF0ZSA9IG5ldyBSeFN0YXRlPERpc2NvdXJzZUZlZWRTZXJ2aWNlU3RhdGU+KCk7XG4gIHByaXZhdGUgbmV0d29yayA9IGluamVjdChOZXR3b3JrU2VydmljZSk7XG5cbiAgbG9jYWxlJCA9IHRoaXMuX3N0YXRlLnNlbGVjdCgnbG9jYWxlJyk7XG4gIGZlZWRVcmxzJCA9IHRoaXMuX3N0YXRlLnNlbGVjdCgnZmVlZFVybHMnKTtcblxuICBnZXQgZmVlZFVybHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9zdGF0ZS5nZXQoJ2ZlZWRVcmxzJyk7XG4gIH1cblxuICBzZXQgZmVlZFVybHModXJsczogc3RyaW5nW10pIHtcbiAgICB0aGlzLl9zdGF0ZS5zZXQoJ2ZlZWRVcmxzJywgKCkgPT4gdXJscyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHNldHRpbmdzOiBMb2NhbFNldHRpbmdzU2VydmljZSxcbiAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEVOVklST05NRU5UKSBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50XG4gICkge1xuICAgIHN1cGVyKHNldHRpbmdzKTtcblxuICAgIHRoaXMuX2RlYnVnID0gIWVudmlyb25tZW50LnByb2R1Y3Rpb247XG4gICAgaWYgKHRoaXMuX2RlYnVnKSBjb25zb2xlLmRlYnVnKCdbZGlzY291cnNlLWZlZWQtc2VydmljZV0gQ3JlYXRpbmcgc2VydmljZScpO1xuXG4gICAgdGhpcy5fc3RhdGUuY29ubmVjdCgnbG9jYWxlJywgdGhpcy5zZXR0aW5ncy5sb2NhbGUkKTtcblxuICAgIHRoaXMuX3N0YXRlLmNvbm5lY3QoXG4gICAgICAnZmVlZFVybHMnLFxuICAgICAgdGhpcy5sb2NhbGUkLnBpcGUoXG4gICAgICAgIGZpbHRlcihpc05vdE5pbE9yQmxhbmspLFxuICAgICAgICBtYXAoKGxvY2FsZSkgPT4gKGxvY2FsZSAmJiBlbnZpcm9ubWVudC5mZWVkPy5qc29uRmVlZD8uW2xvY2FsZV0pID8/IFtdKVxuICAgICAgKVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgbmdPblN0YXJ0KCk6IFByb21pc2U8RGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZT4ge1xuICAgIGF3YWl0IHRoaXMuc2V0dGluZ3MucmVhZHkoKTtcbiAgICByZXR1cm4ge1xuICAgICAgbG9jYWxlOiB0aGlzLnNldHRpbmdzLmxvY2FsZSxcbiAgICB9O1xuICB9XG5cbiAgd2F0Y2hBbGwob3B0cz86IHsgdXJscz86IHN0cmluZ1tdOyBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjsgbWF4Q29udGVudExlbmd0aD86IG51bWJlciB9KTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PEpzb25GZWVkPj4ge1xuICAgIGlmICghdGhpcy5zdGFydGVkKSB7XG4gICAgICByZXR1cm4gZnJvbSh0aGlzLnN0YXJ0KCkpLnBpcGUoc3dpdGNoTWFwKCgpID0+IHRoaXMud2F0Y2hBbGwob3B0cykpKTtcbiAgICB9XG4gICAgaWYgKGlzTm90RW1wdHlBcnJheShvcHRzPy51cmxzKSkge1xuICAgICAgcmV0dXJuIHRoaXMubG9jYWxlJC5waXBlKG1lcmdlTWFwKChsb2NhbGUpID0+IHRoaXMubG9hZEFsbChvcHRzLnVybHMsIHsgbG9jYWxlLCAuLi5vcHRzIH0pKSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmZlZWRVcmxzJC5waXBlKFxuICAgICAgZmlsdGVyKGlzTm90RW1wdHlBcnJheSksXG4gICAgICBtZXJnZU1hcCgodXJscykgPT4gdGhpcy5sb2FkQWxsKHVybHMsIG9wdHMpKVxuICAgICk7XG4gIH1cblxuICBnZXRIb21lVXJsKGZlZWQ/OiBKc29uRmVlZCkge1xuICAgIGNvbnN0IGZlZWRVcmwgPSBmZWVkPy5mZWVkX3VybCA/PyBmaXJzdEFycmF5VmFsdWUodGhpcy5mZWVkVXJscyk7XG4gICAgcmV0dXJuIGZlZWRVcmwgPyBVcmxVdGlscy5nZXRSb290VXJsKGZlZWRVcmwpIDogdW5kZWZpbmVkO1xuICB9XG5cbiAgZ2V0VGFnVXJsKGZlZWQ6IEpzb25GZWVkLCB0YWc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKCFmZWVkIHx8ICF0YWcpIHRocm93IG5ldyBFcnJvcihcIk1pc3NpbmcgJ2ZlZWQnIG9yICd0YWcnIGFyZ3VtZW50XCIpO1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldEhvbWVVcmwoZmVlZCk7XG4gICAgcmV0dXJuIGZlZWQudGFnX3RlbXBsYXRlPy5yZXBsYWNlKCd7dGFnfScsIHRhZykgPz8gYmFzZVVybCArICcvdGFnLycgKyB0YWc7XG4gIH1cblxuICBhc3luYyBsb2FkKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdHM/OiB7XG4gICAgICBsb2NhbGU/OiBzdHJpbmc7XG4gICAgICBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjtcbiAgICAgIG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXI7XG4gICAgICAvLyBJbnRlcm5hbCBvcHRpb25zIChmb3IgcmVjdXJzaXZlIGNhbGxzKVxuICAgICAgY2xvc2VBcGlzPzogYm9vbGVhbjtcbiAgICAgIGRlcHRoPzogbnVtYmVyO1xuICAgIH1cbiAgKTogUHJvbWlzZTxKc29uRmVlZD4ge1xuICAgIGNvbnN0IHsgZGF0YSB9ID0gYXdhaXQgdGhpcy5sb2FkQWxsKFt1cmxdLCBvcHRzKTtcbiAgICByZXR1cm4gZGF0YT8uWzBdO1xuICB9XG5cbiAgYXN5bmMgbG9hZEFsbChcbiAgICB1cmxzPzogc3RyaW5nW10sXG4gICAgb3B0cz86IHtcbiAgICAgIGxvY2FsZT86IHN0cmluZztcbiAgICAgIG1heEFnZUluTW9udGhzPzogbnVtYmVyO1xuICAgICAgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIC8vIEludGVybmFsIG9wdGlvbnMgKGZvciByZWN1cnNpdmUgY2FsbHMpXG4gICAgICBjbG9zZUFwaXM/OiBib29sZWFuO1xuICAgICAgZGVwdGg/OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPExvYWRSZXN1bHQ8SnNvbkZlZWQ+PiB7XG4gICAgYXdhaXQgdGhpcy5yZWFkeSgpO1xuICAgIHVybHMgPSB1cmxzID8/IHRoaXMuZmVlZFVybHM7XG4gICAgb3B0cyA9IHtcbiAgICAgIG1heEFnZUluTW9udGhzOiBvcHRzPy5tYXhBZ2VJbk1vbnRocyA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heEFnZUluTW9udGhzLFxuICAgICAgbWF4Q29udGVudExlbmd0aDogb3B0cz8ubWF4Q29udGVudExlbmd0aCA/PyB0aGlzLmVudmlyb25tZW50LmZlZWQ/Lm1heENvbnRlbnRMZW5ndGgsXG4gICAgICBsb2NhbGU6IHRoaXMuc2V0dGluZ3MubG9jYWxlLFxuICAgICAgZGVwdGg6IDAsXG4gICAgICBjbG9zZUFwaXM6IHRydWUsXG4gICAgICAuLi5vcHRzLFxuICAgIH07XG4gICAgY29uc3QgZmVlZHMgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICh1cmxzIHx8IFtdKS5tYXAoYXN5bmMgKHVybCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIC8vIEdldCBKU09OXG4gICAgICAgICAgY29uc3QganNvbiA9IGF3YWl0IHRoaXMubmV0d29yay5mZXRjaCh1cmwpO1xuICAgICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fUxvYWRlZCBKU09OIGZyb20gJHt1cmx9YCwganNvbik7XG4gICAgICAgICAgaWYgKEpzb25GZWVkVXRpbHMuaXNKc29uRmVlZChqc29uKSkge1xuICAgICAgICAgICAgLy8gTWlncmF0ZSBvbGQgdmVyc2lvblxuICAgICAgICAgICAgbGV0IGZlZWQgPSBKc29uRmVlZFV0aWxzLm1pZ3JhdGVGZWVkKGpzb24pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIGl0ZW1zIChlLmcuIHVzaW5nIGZlZWQubmV4dF91cmwpXG4gICAgICAgICAgICBmZWVkID0gYXdhaXQgdGhpcy5yZXNvbHZlRmVlZEl0ZW1zKGZlZWQsIHsgLi4ub3B0cywgZGVwdGg6IG9wdHM/LmRlcHRoID8/IDAgfSk7XG5cbiAgICAgICAgICAgIC8vIFRydW5jYXRlIGh0bWxcbiAgICAgICAgICAgIEpzb25GZWVkVXRpbHMudHJ1bmNhdGVGZWVkSXRlbXNIdG1sKGZlZWQsIG9wdHMpO1xuXG4gICAgICAgICAgICByZXR1cm4gaXNOb3RFbXB0eUFycmF5KGZlZWQ/Lml0ZW1zKSA/IFtmZWVkXSA6IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIEdldCBkaXNjb3Vyc2VcbiAgICAgICAgICBpZiAoRGlzY291cnNlVXRpbHMuaXNEaXNjb3Vyc2VPYmplY3QoanNvbikpIHtcbiAgICAgICAgICAgIGNvbnN0IGFwaSA9IHRoaXMuZ2V0T3JDcmVhdGVEaXNjb3Vyc2VBcGkodXJsKTtcbiAgICAgICAgICAgIHJldHVybiBhd2FpdCBEaXNjb3Vyc2VVdGlscy5nZXRGZWVkc0J5VXJsKHVybCwgeyAuLi5vcHRzLCBhcGkgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgaWYgKGVycj8uc3RhdHVzID09PSA0MDQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkIGF0ICR7dXJsfS4gNDA0IChOb3QgZm91bmQpYCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoYCR7dGhpcy5fbG9nUHJlZml4fSBFcnJvciB3aGlsZSBmZXRjaGluZyBmZWVkIGF0ICR7dXJsfWAsIGVycik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoW10pO1xuICAgICAgICB9XG4gICAgICB9KVxuICAgICk7XG5cbiAgICBpZiAob3B0cz8uY2xvc2VBcGlzICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5jbG9zZUFwaXMoKTtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhID0gZmVlZHMuZmxhdCgpO1xuXG4gICAgcmV0dXJuIHsgZGF0YSwgdG90YWw6IGRhdGEubGVuZ3RoIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0T3JDcmVhdGVEaXNjb3Vyc2VBcGkodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBiYXNlVXJsID0gRGlzY291cnNlVXRpbHMuZ2V0RGlzY291cnNlQmFzZVVybCh1cmwpO1xuICAgIGxldCBhcGkgPSB0aGlzLmRpc2NvdXJzZUFwaXMuZ2V0KGJhc2VVcmwpO1xuICAgIGlmICghYXBpKSB7XG4gICAgICBhcGkgPSBuZXcgRGlzY291cnNlQVBJKGJhc2VVcmwpO1xuICAgICAgdGhpcy5kaXNjb3Vyc2VBcGlzLnNldChiYXNlVXJsLCBhcGkpO1xuICAgIH1cbiAgICByZXR1cm4gYXBpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNsb3NlQXBpcygpIHtcbiAgICB0aGlzLmRpc2NvdXJzZUFwaXMuY2xlYXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyByZXNvbHZlRmVlZEl0ZW1zKFxuICAgIGpzb246IEpzb25GZWVkLFxuICAgIG9wdHM/OiB7XG4gICAgICBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyO1xuICAgICAgZGVwdGg/OiBudW1iZXI7XG4gICAgfVxuICApOiBQcm9taXNlPEpzb25GZWVkPiB7XG4gICAgaWYgKCFqc29uKSByZXR1cm4ganNvbjtcblxuICAgIC8vIExvYWQgaXRlbXNcbiAgICBpZiAoaXNFbXB0eUFycmF5KGpzb24uaXRlbXMpICYmIGlzTm90TmlsT3JCbGFuayhqc29uLm5leHRfdXJsKSkge1xuICAgICAgY29uc3QgZGVwdGggPSBvcHRzPy5kZXB0aCA/PyAwO1xuICAgICAgaWYgKGRlcHRoID49IDMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1NYXggZGVwdGggcmVhY2hlZCAoJHtkZXB0aH0pIGZvciAke2pzb24uZmVlZF91cmx9YCk7XG4gICAgICAgIHJldHVybiBqc29uO1xuICAgICAgfVxuXG4gICAgICAvLyBMb2FkIGl0ZW1zXG4gICAgICBjb25zdCBmZWVkID0gYXdhaXQgdGhpcy5sb2FkKGpzb24ubmV4dF91cmwsIHsgLi4ub3B0cywgY2xvc2VBcGlzOiBmYWxzZSwgZGVwdGg6IGRlcHRoICsgMSB9KTtcblxuICAgICAgaWYgKGlzRW1wdHlBcnJheShmZWVkPy5pdGVtcykpIHtcbiAgICAgICAgcmV0dXJuIGpzb247XG4gICAgICB9XG5cbiAgICAgIC8vIE1lcmdlIHdpdGggdGhlIGlucHV0IGpzb25cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmpzb24sXG4gICAgICAgIHRpdGxlOiBqc29uLnRpdGxlID8/IGZlZWQudGl0bGUsXG4gICAgICAgIGhvbWVfcGFnZV91cmw6IGpzb24uaG9tZV9wYWdlX3VybCA/PyBmZWVkLmhvbWVfcGFnZV91cmwsXG4gICAgICAgIGF1dGhvcnM6IGlzTm90RW1wdHlBcnJheShqc29uLmF1dGhvcnMpID8ganNvbi5hdXRob3JzIDogZmVlZC5hdXRob3JzLFxuICAgICAgICBpdGVtczogZmVlZC5pdGVtcyxcbiAgICAgICAgdGFnX3RlbXBsYXRlOiBqc29uLnRhZ190ZW1wbGF0ZSA/PyBmZWVkLnRhZ190ZW1wbGF0ZSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzb247XG4gIH1cbn1cbiJdfQ==
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLm1vZGVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC9kaXNjb3Vyc2UvZGlzY291cnNlLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IG9wZXJhdGlvbnMgfSBmcm9tICdkaXNjb3Vyc2UyL2VzbS9zY2hlbWEnO1xuXG5leHBvcnQgdHlwZSBEaXNjb3Vyc2VDYXRlZ29yeSA9IG9wZXJhdGlvbnNbJ2xpc3RDYXRlZ29yeVRvcGljcyddWydyZXNwb25zZXMnXVsnMjAwJ11bJ2NvbnRlbnQnXVsnYXBwbGljYXRpb24vanNvbiddO1xuZXhwb3J0IHR5cGUgRGlzY291cnNlQ2F0ZWdvcnlUb3BpYyA9IERpc2NvdXJzZUNhdGVnb3J5Wyd0b3BpY19saXN0J11bJ3RvcGljcyddWzBdO1xuZXhwb3J0IHR5cGUgRGlzY291cnNlVG9waWMgPSBvcGVyYXRpb25zWydnZXRUb3BpYyddWydyZXNwb25zZXMnXVsnMjAwJ11bJ2NvbnRlbnQnXVsnYXBwbGljYXRpb24vanNvbiddO1xuXG5leHBvcnQgdHlwZSBEaXNjb3Vyc2VQb3N0ID0gb3BlcmF0aW9uc1snZ2V0VG9waWMnXVsncmVzcG9uc2VzJ11bJzIwMCddWydjb250ZW50J11bJ2FwcGxpY2F0aW9uL2pzb24nXVsncG9zdF9zdHJlYW0nXVsncG9zdHMnXVswXSAmIHtcbiAgcG9zdF91cmw/OiBzdHJpbmc7XG59O1xuIl19
@@ -1,168 +0,0 @@
1
- import DiscourseAPI from 'discourse2';
2
- import { Promise } from '@rx-angular/cdk/zone-less/browser';
3
- import { JsonFeedUtils } from '../feed.model';
4
- import { UrlUtils } from '../../../shared/file/url.utils';
5
- import { isEmptyArray, isNotNil } from '../../../shared/functions';
6
- import { DateUtils } from '../../../shared/dates';
7
- export class DiscourseUtils {
8
- static _logPrefix = '[discourse-utils]';
9
- static removeJsonExtension = JsonFeedUtils.removeJsonExtension;
10
- static isDiscourseObject(json) {
11
- return this.isDiscourseTopic(json) || this.isDiscourseCategory(json);
12
- }
13
- static isDiscourseTopic(json) {
14
- return (json && !!json.post_stream?.posts && json.fancy_title && json.slug && json.details?.created_by && true) || false;
15
- }
16
- static isDiscourseCategory(json) {
17
- return (json && json.topic_list?.topics && json.posters && true) || false;
18
- }
19
- static getDiscourseBaseUrl(url) {
20
- return UrlUtils.getRootUrl(url);
21
- }
22
- static isDiscourseCategoryUrl(url) {
23
- const baseUrl = this.getDiscourseBaseUrl(url);
24
- return baseUrl && url.substring(baseUrl.length).match(/^\/c\//);
25
- }
26
- static extractCategoryIdFromUrl(url) {
27
- const match = this.removeJsonExtension(url).match(/\/(\d+)$/);
28
- return match ? parseInt(match[1], 10) : null;
29
- }
30
- static extractCategorySlugFromUrl(url) {
31
- const match = this.removeJsonExtension(url).match(/\/c\/([\w/-]+)\/\d+$/);
32
- return match ? match[1] : null;
33
- }
34
- static extractTopicIdFromUrl(url) {
35
- const match = url.match(/\/(\d+)(?:$|\/)/) || url.match(/\/(\d+)\.json$/);
36
- return match ? parseInt(match[1], 10) : null;
37
- }
38
- static getLanguageFromTitle(title) {
39
- if (!title)
40
- return '';
41
- const match = title.match('\\s\\(([a-z]{2}(?:-[A-Z]{2})?)\\)$');
42
- return match && match[1];
43
- }
44
- static async getFeedsByUrl(url, opts) {
45
- try {
46
- // Check a category
47
- if (DiscourseUtils.isDiscourseCategoryUrl(url)) {
48
- console.debug(`${this._logPrefix}Detected a Discourse category at: ${url}`);
49
- return this.getFeedsByCategoryUrl(url, opts);
50
- }
51
- // Or a topic
52
- else {
53
- const post = await this.getFeedByTopicUrl(url, opts);
54
- return post ? [post] : [];
55
- }
56
- }
57
- catch (err) {
58
- console.error(`${this._logPrefix}`, err);
59
- return [];
60
- }
61
- }
62
- static async getFeedsByCategoryUrl(url, opts) {
63
- const categoryId = this.extractCategoryIdFromUrl(url);
64
- const categorySlug = this.extractCategorySlugFromUrl(url);
65
- const baseUrl = this.getDiscourseBaseUrl(url);
66
- const api = opts?.api ?? new DiscourseAPI(baseUrl);
67
- const category = await api.listCategoryTopics({ id: categoryId, slug: categorySlug });
68
- const topics = (category?.topic_list?.topics || []).filter((topic) => {
69
- const topicLocale = this.getLanguageFromTitle(topic.fancy_title);
70
- return (topic.pinned &&
71
- topic.visible &&
72
- // Keep same locale, if exists
73
- (!topicLocale || !opts?.locale || topicLocale === opts.locale));
74
- });
75
- const posts = (await Promise.all(topics.map(async (t) => {
76
- const topic = await api.getTopic({ id: t.id.toString() });
77
- // Ignore 'About' topics
78
- if (topic.tags.includes('about-category'))
79
- return undefined;
80
- const posts = this.filterRecentPosts(topic.post_stream.posts, opts);
81
- if (isEmptyArray(posts))
82
- return undefined;
83
- return this.toFeed(posts, topic, url, opts);
84
- }))).filter(isNotNil);
85
- if (isEmptyArray(posts)) {
86
- console.warn(`${this._logPrefix}No recent post found on category #${categoryId}`);
87
- }
88
- return posts;
89
- }
90
- static async getFeedByTopicUrl(url, opts) {
91
- const topicId = this.extractTopicIdFromUrl(url);
92
- if (!topicId) {
93
- console.error(`${this._logPrefix}Invalid URL`);
94
- return undefined;
95
- }
96
- const api = opts?.api ?? new DiscourseAPI(this.getDiscourseBaseUrl(url));
97
- const topic = await api.getTopic({ id: topicId.toString() });
98
- // Ignore about category
99
- if (topic.tags?.includes('about-category'))
100
- return undefined;
101
- const posts = this.filterRecentPosts(topic.post_stream.posts, opts);
102
- if (isEmptyArray(posts)) {
103
- console.warn(`${this._logPrefix}No recent posts found in topic #${topicId}`);
104
- return undefined;
105
- }
106
- return this.toFeed(posts, topic, url, opts);
107
- }
108
- static filterRecentPosts(posts, opts) {
109
- const maxAgeInMonths = opts?.maxAgeInMonths ?? JsonFeedUtils.DEFAULT_MAX_POST_AGE_IN_MONTHS;
110
- if (maxAgeInMonths <= 0)
111
- return posts; // Accept all
112
- const minDate = maxAgeInMonths > 0 ? DateUtils.moment().subtract(maxAgeInMonths, 'month').startOf('day').utc() : undefined;
113
- return (posts || []).filter((post) => post && DateUtils.moment(post.created_at).isSameOrAfter(minDate));
114
- }
115
- static toFeed(posts, topic, url, opts) {
116
- const baseUrl = this.getDiscourseBaseUrl(url);
117
- const title = this.cleanTitle(topic.fancy_title ?? topic.title);
118
- const items = (posts || []).map((post) => this.toFeedItem(post, topic, url, opts));
119
- const firstItem = items?.[0];
120
- if (firstItem)
121
- firstItem.title = title;
122
- const authorName = topic?.details?.created_by && (topic.details.created_by.name || topic.details.created_by.username);
123
- const authorAvatar = baseUrl + topic.details.created_by.avatar_template.replace('{size}', '48');
124
- return {
125
- version: JsonFeedUtils.VERSION_1_1,
126
- feed_url: url,
127
- title: this.cleanTitle(topic.fancy_title),
128
- expired: topic.archived,
129
- authors: [
130
- {
131
- name: authorName,
132
- avatar: authorAvatar,
133
- },
134
- ],
135
- items,
136
- tag_template: baseUrl + '/tag/{tag}',
137
- };
138
- }
139
- static toFeedItem(post, topic, url, opts) {
140
- const baseUrl = this.getDiscourseBaseUrl(url);
141
- url = post.post_url ? baseUrl + post.post_url : url;
142
- const id = post.post_url ? baseUrl + post.post_url : post.id;
143
- const html = JsonFeedUtils.truncateHtml(post.cooked, opts);
144
- const truncated = html?.length !== post.cooked?.length;
145
- const authorName = post.name || post.username;
146
- const authorAvatar = baseUrl + (post.avatar_template.replace('{size}', '48') ?? topic.details.last_poster.avatar_template.replace('{size}', '48'));
147
- return {
148
- id,
149
- url,
150
- authors: [
151
- {
152
- name: authorName,
153
- avatar: authorAvatar,
154
- },
155
- ],
156
- content_html: html,
157
- date_published: post.created_at,
158
- tags: topic.tags,
159
- truncated,
160
- };
161
- }
162
- static cleanTitle(title) {
163
- if (!title)
164
- return undefined;
165
- return title.replace(/\s\([a-z]{2}(:?-[A-Z]{2})?\)$/, '');
166
- }
167
- }
168
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLnV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zb2NpYWwvZmVlZC9kaXNjb3Vyc2UvZGlzY291cnNlLnV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sWUFBWSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUQsT0FBTyxFQUEwQixhQUFhLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFdEUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWxELE1BQU0sT0FBZ0IsY0FBYztJQUNsQyxNQUFNLENBQUMsVUFBVSxHQUFHLG1CQUFtQixDQUFDO0lBRXhDLE1BQU0sQ0FBQyxtQkFBbUIsR0FBRyxhQUFhLENBQUMsbUJBQW1CLENBQUM7SUFFL0QsTUFBTSxDQUFDLGlCQUFpQixDQUFDLElBQVM7UUFDaEMsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBbUM7UUFDekQsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsVUFBVSxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUMzSCxDQUFDO0lBRUQsTUFBTSxDQUFDLG1CQUFtQixDQUFDLElBQXNDO1FBQy9E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QVcsQ0FBQyxlQUFlLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2hJLE9BQXFCO1lBQ25CLEVBQUU7WUFDRixHQUFHO1lBQ0gsT0FBTyxFQUFFO2dCQUNQO29CQUNFLElBQUksRUFBRSxVQUFVO29CQUNoQixNQUFNLEVBQUUsWUFBWTtpQkFDckI7YUFDRjtZQUNELFlBQVksRUFBRSxJQUFJO1lBQ2xCLGNBQWMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMvQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7WUFDaEIsU0FBUztTQUNWLENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFhO1FBQzdCLElBQUksQ0FBQyxLQUFLO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFDN0IsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLCtCQUErQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgRGlzY291cnNlQVBJIGZyb20gJ2Rpc2NvdXJzZTInO1xuaW1wb3J0IHsgUHJvbWlzZSB9IGZyb20gJ0ByeC1hbmd1bGFyL2Nkay96b25lLWxlc3MvYnJvd3Nlcic7XG5pbXBvcnQgeyBKc29uRmVlZCwgSnNvbkZlZWRJdGVtLCBKc29uRmVlZFV0aWxzIH0gZnJvbSAnLi4vZmVlZC5tb2RlbCc7XG5pbXBvcnQgeyBEaXNjb3Vyc2VDYXRlZ29yeSwgRGlzY291cnNlQ2F0ZWdvcnlUb3BpYywgRGlzY291cnNlUG9zdCwgRGlzY291cnNlVG9waWMgfSBmcm9tICcuL2Rpc2NvdXJzZS5tb2RlbCc7XG5pbXBvcnQgeyBVcmxVdGlscyB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9maWxlL3VybC51dGlscyc7XG5pbXBvcnQgeyBpc0VtcHR5QXJyYXksIGlzTm90TmlsIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2Z1bmN0aW9ucyc7XG5pbXBvcnQgeyBEYXRlVXRpbHMgfSBmcm9tICcuLi8uLi8uLi9zaGFyZWQvZGF0ZXMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRGlzY291cnNlVXRpbHMge1xuICBzdGF0aWMgX2xvZ1ByZWZpeCA9ICdbZGlzY291cnNlLXV0aWxzXSc7XG5cbiAgc3RhdGljIHJlbW92ZUpzb25FeHRlbnNpb24gPSBKc29uRmVlZFV0aWxzLnJlbW92ZUpzb25FeHRlbnNpb247XG5cbiAgc3RhdGljIGlzRGlzY291cnNlT2JqZWN0KGpzb246IGFueSk6IGpzb24gaXMgRGlzY291cnNlVG9waWMgfCBEaXNjb3Vyc2VDYXRlZ29yeSB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNjb3Vyc2VUb3BpYyhqc29uKSB8fCB0aGlzLmlzRGlzY291cnNlQ2F0ZWdvcnkoanNvbik7XG4gIH1cblxuICBzdGF0aWMgaXNEaXNjb3Vyc2VUb3BpYyhqc29uOiBhbnkgfCBQYXJ0aWFsPERpc2NvdXJzZVRvcGljPik6IGpzb24gaXMgRGlzY291cnNlVG9waWMge1xuICAgIHJldHVybiAoanNvbiAmJiAhIWpzb24ucG9zdF9zdHJlYW0/LnBvc3RzICYmIGpzb24uZmFuY3lfdGl0bGUgJiYganNvbi5zbHVnICYmIGpzb24uZGV0YWlscz8uY3JlYXRlZF9ieSAmJiB0cnVlKSB8fCBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBpc0Rpc2NvdXJzZUNhdGVnb3J5KGpzb246IGFueSB8IFBhcnRpYWw8RGlzY291cnNlQ2F0ZWdvcnk+KToganNvbiBpcyBEaXNjb3Vyc2VDYXRlZ29yeSB7XG4gICAgcmV0dXJuIChqc29uICYmIGpzb24udG9waWNfbGlzdD8udG9waWNzICYmIGpzb24ucG9zdGVycyAmJiB0cnVlKSB8fCBmYWxzZTtcbiAgfVxuXG4gIHN0YXRpYyBnZXREaXNjb3Vyc2VCYXNlVXJsKHVybDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIFVybFV0aWxzLmdldFJvb3RVcmwodXJsKTtcbiAgfVxuXG4gIHN0YXRpYyBpc0Rpc2NvdXJzZUNhdGVnb3J5VXJsKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgYmFzZVVybCA9IHRoaXMuZ2V0RGlzY291cnNlQmFzZVVybCh1cmwpO1xuICAgIHJldHVybiBiYXNlVXJsICYmIHVybC5zdWJzdHJpbmcoYmFzZVVybC5sZW5ndGgpLm1hdGNoKC9eXFwvY1xcLy8pO1xuICB9XG5cbiAgc3RhdGljIGV4dHJhY3RDYXRlZ29yeUlkRnJvbVVybCh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5yZW1vdmVKc29uRXh0ZW5zaW9uKHVybCkubWF0Y2goL1xcLyhcXGQrKSQvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBleHRyYWN0Q2F0ZWdvcnlTbHVnRnJvbVVybCh1cmw6IHN0cmluZykge1xuICAgIGNvbnN0IG1hdGNoID0gdGhpcy5yZW1vdmVKc29uRXh0ZW5zaW9uKHVybCkubWF0Y2goL1xcL2NcXC8oW1xcdy8tXSspXFwvXFxkKyQvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXSA6IG51bGw7XG4gIH1cblxuICBzdGF0aWMgZXh0cmFjdFRvcGljSWRGcm9tVXJsKHVybDogc3RyaW5nKSB7XG4gICAgY29uc3QgbWF0Y2ggPSB1cmwubWF0Y2goL1xcLyhcXGQrKSg/OiR8XFwvKS8pIHx8IHVybC5tYXRjaCgvXFwvKFxcZCspXFwuanNvbiQvKTtcbiAgICByZXR1cm4gbWF0Y2ggPyBwYXJzZUludChtYXRjaFsxXSwgMTApIDogbnVsbDtcbiAgfVxuXG4gIHN0YXRpYyBnZXRMYW5ndWFnZUZyb21UaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aXRsZSkgcmV0dXJuICcnO1xuXG4gICAgY29uc3QgbWF0Y2ggPSB0aXRsZS5tYXRjaCgnXFxcXHNcXFxcKChbYS16XXsyfSg/Oi1bQS1aXXsyfSk/KVxcXFwpJCcpO1xuICAgIHJldHVybiBtYXRjaCAmJiBtYXRjaFsxXTtcbiAgfVxuXG4gIHN0YXRpYyBhc3luYyBnZXRGZWVkc0J5VXJsKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdHM/OiB7IGFwaT86IERpc2NvdXJzZUFQSTsgbG9jYWxlPzogc3RyaW5nOyBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjsgbWF4Q29udGVudExlbmd0aD86IG51bWJlciB9XG4gICk6IFByb21pc2U8SnNvbkZlZWRbXT4ge1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBhIGNhdGVnb3J5XG4gICAgICBpZiAoRGlzY291cnNlVXRpbHMuaXNEaXNjb3Vyc2VDYXRlZ29yeVVybCh1cmwpKSB7XG4gICAgICAgIGNvbnNvbGUuZGVidWcoYCR7dGhpcy5fbG9nUHJlZml4fURldGVjdGVkIGEgRGlzY291cnNlIGNhdGVnb3J5IGF0OiAke3VybH1gKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RmVlZHNCeUNhdGVnb3J5VXJsKHVybCwgb3B0cyk7XG4gICAgICB9XG5cbiAgICAgIC8vIE9yIGEgdG9waWNcbiAgICAgIGVsc2Uge1xuICAgICAgICBjb25zdCBwb3N0ID0gYXdhaXQgdGhpcy5nZXRGZWVkQnlUb3BpY1VybCh1cmwsIG9wdHMpO1xuICAgICAgICByZXR1cm4gcG9zdCA/IFtwb3N0XSA6IFtdO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgY29uc29sZS5lcnJvcihgJHt0aGlzLl9sb2dQcmVmaXh9YCwgZXJyKTtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmVlZHNCeUNhdGVnb3J5VXJsKFxuICAgIHVybDogc3RyaW5nLFxuICAgIG9wdHM/OiB7IGFwaT86IERpc2NvdXJzZUFQSTsgbG9jYWxlPzogc3RyaW5nOyBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjsgbWF4Q29udGVudExlbmd0aD86IG51bWJlciB9XG4gICk6IFByb21pc2U8SnNvbkZlZWRbXT4ge1xuICAgIGNvbnN0IGNhdGVnb3J5SWQgPSB0aGlzLmV4dHJhY3RDYXRlZ29yeUlkRnJvbVVybCh1cmwpO1xuICAgIGNvbnN0IGNhdGVnb3J5U2x1ZyA9IHRoaXMuZXh0cmFjdENhdGVnb3J5U2x1Z0Zyb21VcmwodXJsKTtcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXREaXNjb3Vyc2VCYXNlVXJsKHVybCk7XG4gICAgY29uc3QgYXBpID0gb3B0cz8uYXBpID8/IG5ldyBEaXNjb3Vyc2VBUEkoYmFzZVVybCk7XG4gICAgY29uc3QgY2F0ZWdvcnk6IERpc2NvdXJzZUNhdGVnb3J5ID0gYXdhaXQgYXBpLmxpc3RDYXRlZ29yeVRvcGljcyh7IGlkOiBjYXRlZ29yeUlkLCBzbHVnOiBjYXRlZ29yeVNsdWcgfSk7XG5cbiAgICBjb25zdCB0b3BpY3MgPSAoY2F0ZWdvcnk/LnRvcGljX2xpc3Q/LnRvcGljcyB8fCBbXSkuZmlsdGVyKCh0b3BpYzogRGlzY291cnNlQ2F0ZWdvcnlUb3BpYykgPT4ge1xuICAgICAgY29uc3QgdG9waWNMb2NhbGUgPSB0aGlzLmdldExhbmd1YWdlRnJvbVRpdGxlKHRvcGljLmZhbmN5X3RpdGxlKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHRvcGljLnBpbm5lZCAmJlxuICAgICAgICB0b3BpYy52aXNpYmxlICYmXG4gICAgICAgIC8vIEtlZXAgc2FtZSBsb2NhbGUsIGlmIGV4aXN0c1xuICAgICAgICAoIXRvcGljTG9jYWxlIHx8ICFvcHRzPy5sb2NhbGUgfHwgdG9waWNMb2NhbGUgPT09IG9wdHMubG9jYWxlKVxuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHBvc3RzID0gKFxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgIHRvcGljcy5tYXAoYXN5bmMgKHQpID0+IHtcbiAgICAgICAgICBjb25zdCB0b3BpYzogRGlzY291cnNlVG9waWMgPSBhd2FpdCBhcGkuZ2V0VG9waWMoeyBpZDogdC5pZC50b1N0cmluZygpIH0pO1xuXG4gICAgICAgICAgLy8gSWdub3JlICdBYm91dCcgdG9waWNzXG4gICAgICAgICAgaWYgKHRvcGljLnRhZ3MuaW5jbHVkZXMoJ2Fib3V0LWNhdGVnb3J5JykpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCBwb3N0cyA9IHRoaXMuZmlsdGVyUmVjZW50UG9zdHModG9waWMucG9zdF9zdHJlYW0ucG9zdHMsIG9wdHMpO1xuICAgICAgICAgIGlmIChpc0VtcHR5QXJyYXkocG9zdHMpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIHJldHVybiB0aGlzLnRvRmVlZChwb3N0cywgdG9waWMsIHVybCwgb3B0cyk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgKS5maWx0ZXIoaXNOb3ROaWwpO1xuXG4gICAgaWYgKGlzRW1wdHlBcnJheShwb3N0cykpIHtcbiAgICAgIGNvbnNvbGUud2FybihgJHt0aGlzLl9sb2dQcmVmaXh9Tm8gcmVjZW50IHBvc3QgZm91bmQgb24gY2F0ZWdvcnkgIyR7Y2F0ZWdvcnlJZH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zdHM7XG4gIH1cblxuICBzdGF0aWMgYXN5bmMgZ2V0RmVlZEJ5VG9waWNVcmwoXG4gICAgdXJsOiBzdHJpbmcsXG4gICAgb3B0cz86IHsgbG9jYWxlPzogc3RyaW5nOyBtYXhBZ2VJbk1vbnRocz86IG51bWJlcjsgbWF4Q29udGVudExlbmd0aD86IG51bWJlcjtcbiAgICAgIC8vIEludGVybmFsIHVzYWdlXG4gICAgICBhcGk/OiBEaXNjb3Vyc2VBUEk7XG4gICAgfVxuICApOiBQcm9taXNlPEpzb25GZWVkPiB7XG4gICAgY29uc3QgdG9waWNJZCA9IHRoaXMuZXh0cmFjdFRvcGljSWRGcm9tVXJsKHVybCk7XG4gICAgaWYgKCF0b3BpY0lkKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGAke3RoaXMuX2xvZ1ByZWZpeH1JbnZhbGlkIFVSTGApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gICAgY29uc3QgYXBpID0gb3B0cz8uYXBpID8/IG5ldyBEaXNjb3Vyc2VBUEkodGhpcy5nZXREaXNjb3Vyc2VCYXNlVXJsKHVybCkpO1xuICAgIGNvbnN0IHRvcGljID0gYXdhaXQgYXBpLmdldFRvcGljKHsgaWQ6IHRvcGljSWQudG9TdHJpbmcoKSB9KTtcblxuICAgIC8vIElnbm9yZSBhYm91dCBjYXRlZ29yeVxuICAgIGlmICh0b3BpYy50YWdzPy5pbmNsdWRlcygnYWJvdXQtY2F0ZWdvcnknKSkgcmV0dXJuIHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHBvc3RzID0gdGhpcy5maWx0ZXJSZWNlbnRQb3N0cyh0b3BpYy5wb3N0X3N0cmVhbS5wb3N0cywgb3B0cyk7XG5cbiAgICBpZiAoaXNFbXB0eUFycmF5KHBvc3RzKSkge1xuICAgICAgY29uc29sZS53YXJuKGAke3RoaXMuX2xvZ1ByZWZpeH1ObyByZWNlbnQgcG9zdHMgZm91bmQgaW4gdG9waWMgIyR7dG9waWNJZH1gKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMudG9GZWVkKHBvc3RzLCB0b3BpYywgdXJsLCBvcHRzKTtcbiAgfVxuXG4gIHN0YXRpYyBmaWx0ZXJSZWNlbnRQb3N0cyhwb3N0czogRGlzY291cnNlUG9zdFtdLCBvcHRzPzogeyBtYXhBZ2VJbk1vbnRocz86IG51bWJlciB9KTogRGlzY291cnNlUG9zdFtdIHtcbiAgICBjb25zdCBtYXhBZ2VJbk1vbnRocyA9IG9wdHM/Lm1heEFnZUluTW9udGhzID8/IEpzb25GZWVkVXRpbHMuREVGQVVMVF9NQVhfUE9TVF9BR0VfSU5fTU9OVEhTO1xuICAgIGlmIChtYXhBZ2VJbk1vbnRocyA8PSAwKSByZXR1cm4gcG9zdHM7IC8vIEFjY2VwdCBhbGxcblxuICAgIGNvbnN0IG1pbkRhdGUgPSBtYXhBZ2VJbk1vbnRocyA+IDAgPyBEYXRlVXRpbHMubW9tZW50KCkuc3VidHJhY3QobWF4QWdlSW5Nb250aHMsICdtb250aCcpLnN0YXJ0T2YoJ2RheScpLnV0YygpIDogdW5kZWZpbmVkO1xuICAgIHJldHVybiAocG9zdHMgfHwgW10pLmZpbHRlcigocG9zdCkgPT4gcG9zdCAmJiBEYXRlVXRpbHMubW9tZW50KHBvc3QuY3JlYXRlZF9hdCkuaXNTYW1lT3JBZnRlcihtaW5EYXRlKSk7XG4gIH1cblxuICBzdGF0aWMgdG9GZWVkKHBvc3RzOiBEaXNjb3Vyc2VQb3N0W10sIHRvcGljOiBEaXNjb3Vyc2VUb3BpYywgdXJsOiBzdHJpbmcsIG9wdHM/OiB7IG1heENvbnRlbnRMZW5ndGg/OiBudW1iZXIgfSk6IEpzb25GZWVkIHtcbiAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5nZXREaXNjb3Vyc2VCYXNlVXJsKHVybCk7XG4gICAgY29uc3QgdGl0bGUgPSB0aGlzLmNsZWFuVGl0bGUodG9waWMuZmFuY3lfdGl0bGUgPz8gdG9waWMudGl0bGUpO1xuICAgIGNvbnN0IGl0ZW1zID0gKHBvc3RzIHx8IFtdKS5tYXAoKHBvc3QpID0+IHRoaXMudG9GZWVkSXRlbShwb3N0LCB0b3BpYywgdXJsLCBvcHRzKSk7XG4gICAgY29uc3QgZmlyc3RJdGVtID0gaXRlbXM/LlswXTtcbiAgICBpZiAoZmlyc3RJdGVtKSBmaXJzdEl0ZW0udGl0bGUgPSB0aXRsZTtcbiAgICBjb25zdCBhdXRob3JOYW1lID0gdG9waWM/LmRldGFpbHM/LmNyZWF0ZWRfYnkgJiYgKHRvcGljLmRldGFpbHMuY3JlYXRlZF9ieS5uYW1lIHx8IHRvcGljLmRldGFpbHMuY3JlYXRlZF9ieS51c2VybmFtZSk7XG4gICAgY29uc3QgYXV0aG9yQXZhdGFyID0gYmFzZVVybCArIHRvcGljLmRldGFpbHMuY3JlYXRlZF9ieS5hdmF0YXJfdGVtcGxhdGUucmVwbGFjZSgne3NpemV9JywgJzQ4Jyk7XG4gICAgcmV0dXJuIDxKc29uRmVlZD57XG4gICAgICB2ZXJzaW9uOiBKc29uRmVlZFV0aWxzLlZFUlNJT05fMV8xLFxuICAgICAgZmVlZF91cmw6IHVybCxcbiAgICAgIHRpdGxlOiB0aGlzLmNsZWFuVGl0bGUodG9waWMuZmFuY3lfdGl0bGUpLFxuICAgICAgZXhwaXJlZDogdG9waWMuYXJjaGl2ZWQsXG4gICAgICBhdXRob3JzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBhdXRob3JOYW1lLFxuICAgICAgICAgIGF2YXRhcjogYXV0aG9yQXZhdGFyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGl0ZW1zLFxuICAgICAgdGFnX3RlbXBsYXRlOiBiYXNlVXJsICsgJy90YWcve3RhZ30nLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgdG9GZWVkSXRlbShwb3N0OiBEaXNjb3Vyc2VQb3N0LCB0b3BpYzogRGlzY291cnNlVG9waWMsIHVybDogc3RyaW5nLCBvcHRzPzogeyBtYXhDb250ZW50TGVuZ3RoPzogbnVtYmVyIH0pOiBKc29uRmVlZEl0ZW0ge1xuICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLmdldERpc2NvdXJzZUJhc2VVcmwodXJsKTtcbiAgICB1cmwgPSBwb3N0LnBvc3RfdXJsID8gYmFzZVVybCArIHBvc3QucG9zdF91cmwgOiB1cmw7XG4gICAgY29uc3QgaWQgPSBwb3N0LnBvc3RfdXJsID8gYmFzZVVybCArIHBvc3QucG9zdF91cmwgOiBwb3N0LmlkO1xuICAgIGNvbnN0IGh0bWwgPSBKc29uRmVlZFV0aWxzLnRydW5jYXRlSHRtbChwb3N0LmNvb2tlZCwgb3B0cyk7XG4gICAgY29uc3QgdHJ1bmNhdGVkID0gaHRtbD8ubGVuZ3RoICE9PSBwb3N0LmNvb2tlZD8ubGVuZ3RoO1xuICAgIGNvbnN0IGF1dGhvck5hbWUgPSBwb3N0Lm5hbWUgfHwgcG9zdC51c2VybmFtZTtcbiAgICBjb25zdCBhdXRob3JBdmF0YXIgPVxuICAgICAgYmFzZVVybCArIChwb3N0LmF2YXRhcl90ZW1wbGF0ZS5yZXBsYWNlKCd7c2l6ZX0nLCAnNDgnKSA/PyB0b3BpYy5kZXRhaWxzLmxhc3RfcG9zdGVyLmF2YXRhcl90ZW1wbGF0ZS5yZXBsYWNlKCd7c2l6ZX0nLCAnNDgnKSk7XG4gICAgcmV0dXJuIDxKc29uRmVlZEl0ZW0+e1xuICAgICAgaWQsXG4gICAgICB1cmwsXG4gICAgICBhdXRob3JzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiBhdXRob3JOYW1lLFxuICAgICAgICAgIGF2YXRhcjogYXV0aG9yQXZhdGFyLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICAgIGNvbnRlbnRfaHRtbDogaHRtbCxcbiAgICAgIGRhdGVfcHVibGlzaGVkOiBwb3N0LmNyZWF0ZWRfYXQsXG4gICAgICB0YWdzOiB0b3BpYy50YWdzLFxuICAgICAgdHJ1bmNhdGVkLFxuICAgIH07XG4gIH1cblxuICBzdGF0aWMgY2xlYW5UaXRsZSh0aXRsZTogc3RyaW5nKSB7XG4gICAgaWYgKCF0aXRsZSkgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICByZXR1cm4gdGl0bGUucmVwbGFjZSgvXFxzXFwoW2Etel17Mn0oOj8tW0EtWl17Mn0pP1xcKSQvLCAnJyk7XG4gIH1cbn1cbiJdfQ==
@@ -1,56 +0,0 @@
1
- import DiscourseAPI from 'discourse2';
2
- import { JsonFeed } from '../feed.model';
3
- import { Observable } from 'rxjs';
4
- import { StartableService } from '../../../shared/services/startable-service.class';
5
- import { LocalSettingsService } from '../../../core/services/local-settings.service';
6
- import { Environment } from '../../../../environments/environment.class';
7
- import { LoadResult } from '../../../shared/services/entity-service.class';
8
- import { IFeedService } from '../feed.service';
9
- import * as i0 from "@angular/core";
10
- export interface DiscourseFeedServiceState {
11
- locale: string;
12
- feedUrls?: string[];
13
- }
14
- export declare class DiscourseFeedService extends StartableService<DiscourseFeedServiceState> implements IFeedService {
15
- private settings;
16
- protected environment: Environment;
17
- private discourseApis;
18
- private _logPrefix;
19
- private _state;
20
- private network;
21
- locale$: Observable<string>;
22
- feedUrls$: Observable<string[]>;
23
- get feedUrls(): string[];
24
- set feedUrls(urls: string[]);
25
- constructor(settings: LocalSettingsService, environment: Environment);
26
- protected ngOnStart(): Promise<DiscourseFeedServiceState>;
27
- watchAll(opts?: {
28
- urls?: string[];
29
- maxAgeInMonths?: number;
30
- maxContentLength?: number;
31
- }): Observable<LoadResult<JsonFeed>>;
32
- getHomeUrl(feed?: JsonFeed): string;
33
- getTagUrl(feed: JsonFeed, tag: string): string;
34
- load(url: string, opts?: {
35
- locale?: string;
36
- maxAgeInMonths?: number;
37
- maxContentLength?: number;
38
- closeApis?: boolean;
39
- depth?: number;
40
- }): Promise<JsonFeed>;
41
- loadAll(urls?: string[], opts?: {
42
- locale?: string;
43
- maxAgeInMonths?: number;
44
- maxContentLength?: number;
45
- closeApis?: boolean;
46
- depth?: number;
47
- }): Promise<LoadResult<JsonFeed>>;
48
- protected getOrCreateDiscourseApi(url: string): DiscourseAPI;
49
- protected closeApis(): void;
50
- protected resolveFeedItems(json: JsonFeed, opts?: {
51
- maxContentLength?: number;
52
- depth?: number;
53
- }): Promise<JsonFeed>;
54
- static ɵfac: i0.ɵɵFactoryDeclaration<DiscourseFeedService, [null, { optional: true; }]>;
55
- static ɵprov: i0.ɵɵInjectableDeclaration<DiscourseFeedService>;
56
- }