@sumaris-net/ngx-components 18.14.15 → 18.14.16
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.
- package/doc/feed/feed-fr.json +8 -6
- package/esm2022/public_api.mjs +4 -4
- package/esm2022/src/app/social/feed/feed.component.mjs +3 -4
- package/esm2022/src/app/social/feed/feed.directive.mjs +4 -4
- package/esm2022/src/app/social/feed/feed.service.mjs +158 -2
- package/esm2022/src/app/social/message/message.form.mjs +4 -3
- package/esm2022/src/app/social/message/message.model.mjs +2 -2
- package/esm2022/src/environments/environment.mjs +4 -2
- package/fesm2022/sumaris-net.ngx-components.mjs +140 -312
- package/fesm2022/sumaris-net.ngx-components.mjs.map +1 -1
- package/package.json +1 -1
- package/public_api.d.ts +0 -3
- package/src/app/social/feed/feed.directive.d.ts +1 -1
- package/src/app/social/feed/feed.service.d.ts +57 -0
- package/src/assets/manifest.json +1 -1
- package/esm2022/src/app/social/feed/discourse/discourse-feed.service.mjs +0 -170
- package/esm2022/src/app/social/feed/discourse/discourse.model.mjs +0 -2
- package/esm2022/src/app/social/feed/discourse/discourse.utils.mjs +0 -168
- package/src/app/social/feed/discourse/discourse-feed.service.d.ts +0 -56
- package/src/app/social/feed/discourse/discourse.model.d.ts +0 -7
- package/src/app/social/feed/discourse/discourse.utils.d.ts +0 -44
package/package.json
CHANGED
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';
|
|
@@ -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":
|
|
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
|
+
}
|
package/src/assets/manifest.json
CHANGED
|
@@ -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.
|
|
5
|
+
"version": "18.14.16",
|
|
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlzY291cnNlLWZlZWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9hcHAvc29jaWFsL2ZlZWQvZGlzY291cnNlL2Rpc2NvdXJzZS1mZWVkLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDNUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sWUFBWSxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQVksYUFBYSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM1RyxPQUFPLEVBQUUsSUFBSSxFQUFjLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxrREFBa0QsQ0FBQztBQUNwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFFeEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxXQUFXLEVBQWUsTUFBTSw0Q0FBNEMsQ0FBQztBQUV0RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7Ozs7QUFTMUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUEyQztJQW1CekU7SUFDbUM7SUFuQnJDLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNoRCxVQUFVLEdBQUcsMkJBQTJCLENBQUM7SUFFekMsTUFBTSxHQUFHLElBQUksT0FBTyxFQUE2QixDQUFDO0lBQ2xELE9BQU8sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7SUFFekMsT0FBTyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzQyxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxJQUFJLFFBQVEsQ0FBQyxJQUFjO1FBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsWUFDVSxRQUE4QixFQUNLLFdBQXdCO1FBRW5FLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUhSLGFBQVEsR0FBUixRQUFRLENBQXNCO1FBQ0ssZ0JBQVcsR0FBWCxXQUFXLENBQWE7UUFJbkUsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTTtZQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsMkNBQTJDLENBQUMsQ0FBQztRQUU1RSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVyRCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDakIsVUFBVSxFQUNWLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUNmLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFDdkIsR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQ3hFLENBQ0YsQ0FBQztJQUNKLENBQUM7SUFFUyxLQUFLLENBQUMsU0FBUztRQUN2QixNQUFNLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDNUIsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU07U0FDN0IsQ0FBQztJQUNKLENBQUM7SUFFRCxRQUFRLENBQUMsSUFBOEU7UUFDckYsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNsQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLENBQUM7UUFDRCxJQUFJLGVBQWUsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNoQyxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0YsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQ3hCLE1BQU0sQ0FBQyxlQUFlLENBQUMsRUFDdkIsUUFBUSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUM3QyxDQUFDO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFlO1FBQ3hCLE1BQU0sT0FBTyxHQUFHLElBQUksRUFBRSxRQUFRLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNqRSxPQUFPLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0lBQzVELENBQUM7SUFFRCxTQUFTLENBQUMsSUFBYyxFQUFFLEdBQVc7UUFDbkMsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUc7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7UUFDdkUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUM3RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FDUixHQUFXLEVBQ1gsSUFPQztRQUVELE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNqRCxPQUFPLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25CLENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUNYLElBQWUsRUFDZixJQU9DO1FBRUQsTUFBTSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbkIsSUFBSSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQzdCLElBQUksR0FBRztZQUNMLGNBQWMsRUFBRSxJQUFJLEVBQUUsY0FBYyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGNBQWM7WUFDN0UsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLGdCQUFnQjtZQUNuRixNQUFNLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNO1lBQzVCLEtBQUssRUFBRSxDQUFDO1lBQ1IsU0FBUyxFQUFFLElBQUk7WUFDZixHQUFHLElBQUk7U0FDUixDQUFDO1FBQ0YsTUFBTSxLQUFLLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUM3QixDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQztnQkFDSCxXQUFXO2dCQUNYLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQzNDLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxvQkFBb0IsR0FBRyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQ2pFLElBQUksYUFBYSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUNuQyxzQkFBc0I7b0JBQ3RCLElBQUksSUFBSSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBRTNDLDJDQUEyQztvQkFDM0MsSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7b0JBRS9FLGdCQUFnQjtvQkFDaEIsYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztvQkFFaEQsT0FBTyxlQUFlLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7Z0JBQ3BELENBQUM7Z0JBRUQsZ0JBQWdCO2dCQUNoQixJQUFJLGNBQWMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO29CQUMzQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQzlDLE9BQU8sTUFBTSxjQUFjLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxFQUFFLEdBQUcsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7Z0JBQ25FLENBQUM7Z0JBRUQsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7Z0JBQ2IsSUFBSSxHQUFHLEVBQUUsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO29CQUN4QixPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsaUNBQWlDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQztnQkFDM0YsQ0FBQztxQkFBTSxDQUFDO29CQUNOLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsVUFBVSxpQ0FBaUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQy9FLENBQUM7Z0JBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FDSCxDQUFDO1FBRUYsSUFBSSxJQUFJLEVBQUUsU0FBUyxLQUFLLEtBQUssRUFBRSxDQUFDO1lBQzlCLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNuQixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRTFCLE9BQU8sRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRVMsdUJBQXVCLENBQUMsR0FBVztRQUMzQyxNQUFNLE9BQU8sR0FBRyxjQUFjLENBQUMsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ1QsR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0lBRVMsU0FBUztRQUNqQixJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCLENBQzlCLElBQWMsRUFDZCxJQUdDO1FBRUQsSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPLElBQUksQ0FBQztRQUV2QixhQUFhO1FBQ2IsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMvRCxNQUFNLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLENBQUMsQ0FBQztZQUMvQixJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDZixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsc0JBQXNCLEtBQUssU0FBUyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDcEYsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBRUQsYUFBYTtZQUNiLE1BQU0sSUFBSSxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLEVBQUUsR0FBRyxJQUFJLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFN0YsSUFBSSxZQUFZLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sSUFBSSxDQUFDO1lBQ2QsQ0FBQztZQUVELDRCQUE0QjtZQUM1QixPQUFPO2dCQUNMLEdBQUcsSUFBSTtnQkFDUCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSztnQkFDL0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWE7Z0JBQ3ZELE9BQU8sRUFBRSxlQUFlLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTztnQkFDcEUsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO2dCQUNqQixZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTthQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQzt3R0F6TVUsb0JBQW9CLHNEQW9CVCxXQUFXOzRHQXBCdEIsb0JBQW9CLGNBRFAsTUFBTTs7NEZBQ25CLG9CQUFvQjtrQkFEaEMsVUFBVTttQkFBQyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUU7OzBCQXFCN0IsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxXQUFXIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0LCBpbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IFByb21pc2UgfSBmcm9tICdAcngtYW5ndWxhci9jZGsvem9uZS1sZXNzL2Jyb3dzZXInO1xuaW1wb3J0IHsgRGlzY291cnNlVXRpbHMgfSBmcm9tICcuL2Rpc2NvdXJzZS51dGlscyc7XG5pbXBvcnQgRGlzY291cnNlQVBJIGZyb20gJ2Rpc2NvdXJzZTInO1xuaW1wb3J0IHsgSnNvbkZlZWQsIEpzb25GZWVkVXRpbHMgfSBmcm9tICcuLi9mZWVkLm1vZGVsJztcbmltcG9ydCB7IGZpcnN0QXJyYXlWYWx1ZSwgaXNFbXB0eUFycmF5LCBpc05vdEVtcHR5QXJyYXksIGlzTm90TmlsT3JCbGFuayB9IGZyb20gJy4uLy4uLy4uL3NoYXJlZC9mdW5jdGlvbnMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgbWVyZ2VNYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBTdGFydGFibGVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL3N0YXJ0YWJsZS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IE5ldHdvcmtTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9uZXR3b3JrLnNlcnZpY2UnO1xuaW1wb3J0IHsgTG9jYWxTZXR0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2xvY2FsLXNldHRpbmdzLnNlcnZpY2UnO1xuaW1wb3J0IHsgUnhTdGF0ZSB9IGZyb20gJ0ByeC1hbmd1bGFyL3N0YXRlJztcbmltcG9ydCB7IEVOVklST05NRU5ULCBFbnZpcm9ubWVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2Vudmlyb25tZW50cy9lbnZpcm9ubWVudC5jbGFzcyc7XG5pbXBvcnQgeyBMb2FkUmVzdWx0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3NlcnZpY2VzL2VudGl0eS1zZXJ2aWNlLmNsYXNzJztcbmltcG9ydCB7IFVybFV0aWxzIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ZpbGUvdXJsLnV0aWxzJztcbmltcG9ydCB7IElGZWVkU2VydmljZSB9IGZyb20gJy4uL2ZlZWQuc2VydmljZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlzY291cnNlRmVlZFNlcnZpY2VTdGF0ZSB7XG4gIGxvY2FsZTogc3RyaW5nO1xuICBmZWVkVXJscz86IHN0cmluZ1tdO1xufVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxuZXhwb3J0IGNsYXNzIERpc2NvdXJzZUZlZWRTZXJ2aWNlIGV4dGVuZHMgU3RhcnRhYmxlU2VydmljZTxEaXNjb3Vyc2VGZWVkU2VydmljZVN0YXRlPiBpbXBsZW1lbnRzIElGZWVkU2VydmljZSB7XG4gIHByaXZhdGUgZGlzY291cnNlQXBpcyA9IG5ldyBNYXA8c3RyaW5nLCBEaXNjb3Vyc2VBUEk+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
|
-
}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { operations } from 'discourse2/esm/schema';
|
|
2
|
-
export type DiscourseCategory = operations['listCategoryTopics']['responses']['200']['content']['application/json'];
|
|
3
|
-
export type DiscourseCategoryTopic = DiscourseCategory['topic_list']['topics'][0];
|
|
4
|
-
export type DiscourseTopic = operations['getTopic']['responses']['200']['content']['application/json'];
|
|
5
|
-
export type DiscoursePost = operations['getTopic']['responses']['200']['content']['application/json']['post_stream']['posts'][0] & {
|
|
6
|
-
post_url?: string;
|
|
7
|
-
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import DiscourseAPI from 'discourse2';
|
|
2
|
-
import { JsonFeed, JsonFeedItem, JsonFeedUtils } from '../feed.model';
|
|
3
|
-
import { DiscourseCategory, DiscoursePost, DiscourseTopic } from './discourse.model';
|
|
4
|
-
export declare abstract class DiscourseUtils {
|
|
5
|
-
static _logPrefix: string;
|
|
6
|
-
static removeJsonExtension: typeof JsonFeedUtils.removeJsonExtension;
|
|
7
|
-
static isDiscourseObject(json: any): json is DiscourseTopic | DiscourseCategory;
|
|
8
|
-
static isDiscourseTopic(json: any | Partial<DiscourseTopic>): json is DiscourseTopic;
|
|
9
|
-
static isDiscourseCategory(json: any | Partial<DiscourseCategory>): json is DiscourseCategory;
|
|
10
|
-
static getDiscourseBaseUrl(url: string): string;
|
|
11
|
-
static isDiscourseCategoryUrl(url: string): RegExpMatchArray;
|
|
12
|
-
static extractCategoryIdFromUrl(url: string): number;
|
|
13
|
-
static extractCategorySlugFromUrl(url: string): string;
|
|
14
|
-
static extractTopicIdFromUrl(url: string): number;
|
|
15
|
-
static getLanguageFromTitle(title: string): string;
|
|
16
|
-
static getFeedsByUrl(url: string, opts?: {
|
|
17
|
-
api?: DiscourseAPI;
|
|
18
|
-
locale?: string;
|
|
19
|
-
maxAgeInMonths?: number;
|
|
20
|
-
maxContentLength?: number;
|
|
21
|
-
}): Promise<JsonFeed[]>;
|
|
22
|
-
static getFeedsByCategoryUrl(url: string, opts?: {
|
|
23
|
-
api?: DiscourseAPI;
|
|
24
|
-
locale?: string;
|
|
25
|
-
maxAgeInMonths?: number;
|
|
26
|
-
maxContentLength?: number;
|
|
27
|
-
}): Promise<JsonFeed[]>;
|
|
28
|
-
static getFeedByTopicUrl(url: string, opts?: {
|
|
29
|
-
locale?: string;
|
|
30
|
-
maxAgeInMonths?: number;
|
|
31
|
-
maxContentLength?: number;
|
|
32
|
-
api?: DiscourseAPI;
|
|
33
|
-
}): Promise<JsonFeed>;
|
|
34
|
-
static filterRecentPosts(posts: DiscoursePost[], opts?: {
|
|
35
|
-
maxAgeInMonths?: number;
|
|
36
|
-
}): DiscoursePost[];
|
|
37
|
-
static toFeed(posts: DiscoursePost[], topic: DiscourseTopic, url: string, opts?: {
|
|
38
|
-
maxContentLength?: number;
|
|
39
|
-
}): JsonFeed;
|
|
40
|
-
static toFeedItem(post: DiscoursePost, topic: DiscourseTopic, url: string, opts?: {
|
|
41
|
-
maxContentLength?: number;
|
|
42
|
-
}): JsonFeedItem;
|
|
43
|
-
static cleanTitle(title: string): string;
|
|
44
|
-
}
|