rss.today 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +702 -0
- package/dist/atom1.d.ts +8 -0
- package/dist/atom1.d.ts.map +1 -0
- package/dist/atom1.js +195 -0
- package/dist/atom1.js.map +1 -0
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +2 -0
- package/dist/config/index.js.map +1 -0
- package/dist/feed.d.ts +54 -0
- package/dist/feed.d.ts.map +1 -0
- package/dist/feed.js +58 -0
- package/dist/feed.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -0
- package/dist/json.d.ts +8 -0
- package/dist/json.d.ts.map +1 -0
- package/dist/json.js +97 -0
- package/dist/json.js.map +1 -0
- package/dist/parser/fields.d.ts +12 -0
- package/dist/parser/fields.d.ts.map +1 -0
- package/dist/parser/fields.js +72 -0
- package/dist/parser/fields.js.map +1 -0
- package/dist/parser/parser.d.ts +93 -0
- package/dist/parser/parser.d.ts.map +1 -0
- package/dist/parser/parser.js +411 -0
- package/dist/parser/parser.js.map +1 -0
- package/dist/parser/utils.d.ts +9 -0
- package/dist/parser/utils.d.ts.map +1 -0
- package/dist/parser/utils.js +81 -0
- package/dist/parser/utils.js.map +1 -0
- package/dist/parser.d.ts +106 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +458 -0
- package/dist/parser.js.map +1 -0
- package/dist/rss0_9.d.ts +4 -0
- package/dist/rss0_9.d.ts.map +1 -0
- package/dist/rss0_9.js +77 -0
- package/dist/rss0_9.js.map +1 -0
- package/dist/rss1.d.ts +4 -0
- package/dist/rss1.d.ts.map +1 -0
- package/dist/rss1.js +92 -0
- package/dist/rss1.js.map +1 -0
- package/dist/rss2.d.ts +7 -0
- package/dist/rss2.d.ts.map +1 -0
- package/dist/rss2.js +267 -0
- package/dist/rss2.js.map +1 -0
- package/dist/test/feed-utils.test.d.ts +2 -0
- package/dist/test/feed-utils.test.d.ts.map +1 -0
- package/dist/test/feed-utils.test.js +279 -0
- package/dist/test/feed-utils.test.js.map +1 -0
- package/dist/test/feed.test.d.ts +2 -0
- package/dist/test/feed.test.d.ts.map +1 -0
- package/dist/test/feed.test.js +190 -0
- package/dist/test/feed.test.js.map +1 -0
- package/dist/test/opml.test.d.ts +2 -0
- package/dist/test/opml.test.d.ts.map +1 -0
- package/dist/test/opml.test.js +135 -0
- package/dist/test/opml.test.js.map +1 -0
- package/dist/test/parser-test.cjs +11 -0
- package/dist/test/parser-test.cjs.map +1 -0
- package/dist/test/parser-test.d.cts +2 -0
- package/dist/test/parser-test.d.cts.map +1 -0
- package/dist/test/parser-test01.d.ts +2 -0
- package/dist/test/parser-test01.d.ts.map +1 -0
- package/dist/test/parser-test01.js +19 -0
- package/dist/test/parser-test01.js.map +1 -0
- package/dist/test/parser.test.d.ts +2 -0
- package/dist/test/parser.test.d.ts.map +1 -0
- package/dist/test/parser.test.js +244 -0
- package/dist/test/parser.test.js.map +1 -0
- package/dist/test/test-01.d.ts +2 -0
- package/dist/test/test-01.d.ts.map +1 -0
- package/dist/test/test-01.js +7 -0
- package/dist/test/test-01.js.map +1 -0
- package/dist/test/test-xml2js.d.ts +2 -0
- package/dist/test/test-xml2js.d.ts.map +1 -0
- package/dist/test/test-xml2js.js +43 -0
- package/dist/test/test-xml2js.js.map +1 -0
- package/dist/test/test.d.ts +2 -0
- package/dist/test/test.d.ts.map +1 -0
- package/dist/test/test.js +3 -0
- package/dist/test/test.js.map +1 -0
- package/dist/test/utilities.test.d.ts +2 -0
- package/dist/test/utilities.test.d.ts.map +1 -0
- package/dist/test/utilities.test.js +258 -0
- package/dist/test/utilities.test.js.map +1 -0
- package/dist/types/atom-types.d.ts +100 -0
- package/dist/types/atom-types.d.ts.map +1 -0
- package/dist/types/atom-types.js +2 -0
- package/dist/types/atom-types.js.map +1 -0
- package/dist/types/index.d.ts +63 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +2 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/rss-types.d.ts +504 -0
- package/dist/types/rss-types.d.ts.map +1 -0
- package/dist/types/rss-types.js +2 -0
- package/dist/types/rss-types.js.map +1 -0
- package/dist/uitls/format-check.d.ts +7 -0
- package/dist/uitls/format-check.d.ts.map +1 -0
- package/dist/uitls/format-check.js +28 -0
- package/dist/uitls/format-check.js.map +1 -0
- package/dist/uitls/util.d.ts +9 -0
- package/dist/uitls/util.d.ts.map +1 -0
- package/dist/uitls/util.js +81 -0
- package/dist/uitls/util.js.map +1 -0
- package/dist/util/converter.d.ts +5 -0
- package/dist/util/converter.d.ts.map +1 -0
- package/dist/util/converter.js +97 -0
- package/dist/util/converter.js.map +1 -0
- package/dist/util/feed-utils.d.ts +19 -0
- package/dist/util/feed-utils.d.ts.map +1 -0
- package/dist/util/feed-utils.js +157 -0
- package/dist/util/feed-utils.js.map +1 -0
- package/dist/util/opml.d.ts +29 -0
- package/dist/util/opml.d.ts.map +1 -0
- package/dist/util/opml.js +129 -0
- package/dist/util/opml.js.map +1 -0
- package/dist/util/validator.d.ts +10 -0
- package/dist/util/validator.d.ts.map +1 -0
- package/dist/util/validator.js +143 -0
- package/dist/util/validator.js.map +1 -0
- package/dist/util.d.ts +2 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +7 -0
- package/dist/util.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Feed } from "../feed";
|
|
2
|
+
export function convertToRSS2(parsedFeed) {
|
|
3
|
+
const feed = new Feed({
|
|
4
|
+
id: parsedFeed.feedUrl || parsedFeed.link || "",
|
|
5
|
+
title: parsedFeed.title || "",
|
|
6
|
+
description: parsedFeed.description || "",
|
|
7
|
+
link: parsedFeed.link || "",
|
|
8
|
+
language: parsedFeed.language,
|
|
9
|
+
copyright: parsedFeed.image?.title || "",
|
|
10
|
+
updated: parsedFeed.lastBuildDate ? new Date(parsedFeed.lastBuildDate) : undefined,
|
|
11
|
+
image: parsedFeed.image?.url,
|
|
12
|
+
author: parsedFeed.author ? { name: parsedFeed.author } : undefined
|
|
13
|
+
});
|
|
14
|
+
parsedFeed.items.forEach((item) => {
|
|
15
|
+
feed.addItem({
|
|
16
|
+
title: item.title || "",
|
|
17
|
+
link: item.link || "",
|
|
18
|
+
description: item.contentSnippet || item.content || item.description,
|
|
19
|
+
content: item.content || item.description,
|
|
20
|
+
date: item.pubDate || item.date ? new Date(item.pubDate || item.date) : new Date(),
|
|
21
|
+
author: item.author ? [{ name: item.author }] : undefined,
|
|
22
|
+
category: item.categories?.map((cat) => ({ name: typeof cat === 'string' ? cat : cat.name })),
|
|
23
|
+
enclosure: item.enclosure && item.enclosure.url ? {
|
|
24
|
+
url: item.enclosure.url,
|
|
25
|
+
type: item.enclosure.type || "application/octet-stream",
|
|
26
|
+
length: parseInt(item.enclosure.length || "0")
|
|
27
|
+
} : undefined,
|
|
28
|
+
extensions: item.itunes ? [{ name: "itunes", objects: item.itunes }] : undefined
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
return feed.rss2();
|
|
32
|
+
}
|
|
33
|
+
export function convertToAtom(parsedFeed) {
|
|
34
|
+
const feed = new Feed({
|
|
35
|
+
id: parsedFeed.feedUrl || parsedFeed.link || "",
|
|
36
|
+
title: parsedFeed.title || "",
|
|
37
|
+
description: parsedFeed.description || "",
|
|
38
|
+
link: parsedFeed.link || "",
|
|
39
|
+
language: parsedFeed.language,
|
|
40
|
+
copyright: "",
|
|
41
|
+
updated: parsedFeed.lastBuildDate ? new Date(parsedFeed.lastBuildDate) : new Date(),
|
|
42
|
+
image: parsedFeed.image?.url,
|
|
43
|
+
author: parsedFeed.author ? { name: parsedFeed.author } : undefined
|
|
44
|
+
});
|
|
45
|
+
parsedFeed.items.forEach((item) => {
|
|
46
|
+
feed.addItem({
|
|
47
|
+
title: item.title || "",
|
|
48
|
+
link: item.link || "",
|
|
49
|
+
description: item.summary || item.contentSnippet || item.description,
|
|
50
|
+
content: item.content || item.description,
|
|
51
|
+
date: item.pubDate || item.date ? new Date(item.pubDate || item.date) : new Date(),
|
|
52
|
+
published: item.pubDate ? new Date(item.pubDate) : undefined,
|
|
53
|
+
author: item.author ? [{ name: item.author }] : undefined,
|
|
54
|
+
category: item.categories?.map((cat) => ({ name: typeof cat === 'string' ? cat : cat.name })),
|
|
55
|
+
enclosure: item.enclosure && item.enclosure.url ? {
|
|
56
|
+
url: item.enclosure.url,
|
|
57
|
+
type: item.enclosure.type || "application/octet-stream",
|
|
58
|
+
length: parseInt(item.enclosure.length || "0")
|
|
59
|
+
} : undefined,
|
|
60
|
+
extensions: item.itunes ? [{ name: "itunes", objects: item.itunes }] : undefined
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
return feed.atom1();
|
|
64
|
+
}
|
|
65
|
+
export function convertToJSON(parsedFeed) {
|
|
66
|
+
const feed = new Feed({
|
|
67
|
+
id: parsedFeed.feedUrl || parsedFeed.link || "",
|
|
68
|
+
title: parsedFeed.title || "",
|
|
69
|
+
description: parsedFeed.description || "",
|
|
70
|
+
link: parsedFeed.link || "",
|
|
71
|
+
language: parsedFeed.language,
|
|
72
|
+
copyright: "",
|
|
73
|
+
updated: parsedFeed.lastBuildDate ? new Date(parsedFeed.lastBuildDate) : new Date(),
|
|
74
|
+
image: parsedFeed.image?.url,
|
|
75
|
+
author: parsedFeed.author ? { name: parsedFeed.author } : undefined
|
|
76
|
+
});
|
|
77
|
+
parsedFeed.items.forEach((item) => {
|
|
78
|
+
feed.addItem({
|
|
79
|
+
title: item.title || "",
|
|
80
|
+
link: item.link || "",
|
|
81
|
+
description: item.summary || item.contentSnippet || item.description,
|
|
82
|
+
content: item.content || item.description,
|
|
83
|
+
date: item.pubDate || item.date ? new Date(item.pubDate || item.date) : new Date(),
|
|
84
|
+
published: item.pubDate ? new Date(item.pubDate) : undefined,
|
|
85
|
+
author: item.author ? [{ name: item.author }] : undefined,
|
|
86
|
+
category: item.categories?.map((cat) => ({ name: typeof cat === 'string' ? cat : cat.name })),
|
|
87
|
+
enclosure: item.enclosure && item.enclosure.url ? {
|
|
88
|
+
url: item.enclosure.url,
|
|
89
|
+
type: item.enclosure.type || "application/octet-stream",
|
|
90
|
+
length: parseInt(item.enclosure.length || "0")
|
|
91
|
+
} : undefined,
|
|
92
|
+
extensions: item.itunes ? [{ name: "itunes", objects: item.itunes }] : undefined
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
return feed.json1();
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=converter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converter.js","sourceRoot":"","sources":["../../src/util/converter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ParsedFeed, ParsedItem } from "../parser";
|
|
2
|
+
export interface FeedDiffResult {
|
|
3
|
+
added: ParsedItem[];
|
|
4
|
+
removed: ParsedItem[];
|
|
5
|
+
modified: ParsedItem[];
|
|
6
|
+
unchanged: ParsedItem[];
|
|
7
|
+
}
|
|
8
|
+
export declare function mergeFeeds(feeds: ParsedFeed[]): ParsedFeed;
|
|
9
|
+
export declare function diffFeeds(oldFeed: ParsedFeed, newFeed: ParsedFeed): FeedDiffResult;
|
|
10
|
+
export declare function filterFeed(feed: ParsedFeed, predicate: (item: ParsedItem, index: number) => boolean): ParsedFeed;
|
|
11
|
+
export declare function filterByCategory(feed: ParsedFeed, category: string): ParsedFeed;
|
|
12
|
+
export declare function filterByAuthor(feed: ParsedFeed, author: string): ParsedFeed;
|
|
13
|
+
export declare function filterByDateRange(feed: ParsedFeed, startDate: Date, endDate?: Date): ParsedFeed;
|
|
14
|
+
export declare function sortFeed(feed: ParsedFeed, comparator: (a: ParsedItem, b: ParsedItem) => number): ParsedFeed;
|
|
15
|
+
export declare function sortByDate(feed: ParsedFeed, order?: 'asc' | 'desc'): ParsedFeed;
|
|
16
|
+
export declare function sortByTitle(feed: ParsedFeed, order?: 'asc' | 'desc'): ParsedFeed;
|
|
17
|
+
export declare function limitFeed(feed: ParsedFeed, count: number): ParsedFeed;
|
|
18
|
+
export declare function deduplicateFeed(feed: ParsedFeed): ParsedFeed;
|
|
19
|
+
//# sourceMappingURL=feed-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-utils.d.ts","sourceRoot":"","sources":["../../src/util/feed-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAQxD,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,QAAQ,EAAE,UAAU,EAAE,CAAC;IACvB,SAAS,EAAE,UAAU,EAAE,CAAC;CACzB;AAED,wBAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,UAAU,CAkC1D;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,GAAG,cAAc,CAwClF;AAED,wBAAgB,UAAU,CACxB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,GACtD,UAAU,CAKZ;AAED,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,UAAU,EAChB,QAAQ,EAAE,MAAM,GACf,UAAU,CAQZ;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,UAAU,CAIZ;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,IAAI,EACf,OAAO,CAAC,EAAE,IAAI,GACb,UAAU,CAWZ;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,UAAU,EAChB,UAAU,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,MAAM,GACnD,UAAU,CAKZ;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,GAAE,KAAK,GAAG,MAAe,GAAG,UAAU,CAcvF;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,GAAE,KAAK,GAAG,MAAc,GAAG,UAAU,CASvF;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAKrE;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAgB5D"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
function getGuid(item) {
|
|
2
|
+
if (!item.guid)
|
|
3
|
+
return undefined;
|
|
4
|
+
if (typeof item.guid === "string")
|
|
5
|
+
return item.guid;
|
|
6
|
+
return item.guid._;
|
|
7
|
+
}
|
|
8
|
+
export function mergeFeeds(feeds) {
|
|
9
|
+
if (feeds.length === 0) {
|
|
10
|
+
throw new Error("Cannot merge zero feeds");
|
|
11
|
+
}
|
|
12
|
+
if (feeds.length === 1) {
|
|
13
|
+
return feeds[0];
|
|
14
|
+
}
|
|
15
|
+
const firstFeed = feeds[0];
|
|
16
|
+
const allItems = [];
|
|
17
|
+
feeds.forEach(feed => {
|
|
18
|
+
feed.items.forEach(item => {
|
|
19
|
+
const existing = allItems.find(existing => {
|
|
20
|
+
const existingGuid = getGuid(existing);
|
|
21
|
+
const itemGuid = getGuid(item);
|
|
22
|
+
return (existingGuid && itemGuid && existingGuid === itemGuid) ||
|
|
23
|
+
(!existingGuid && !itemGuid && existing.link === item.link);
|
|
24
|
+
});
|
|
25
|
+
if (!existing) {
|
|
26
|
+
allItems.push(item);
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
...firstFeed,
|
|
32
|
+
title: firstFeed.title ? `Merged: ${firstFeed.title}` : undefined,
|
|
33
|
+
items: allItems
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function diffFeeds(oldFeed, newFeed) {
|
|
37
|
+
const oldItemsMap = new Map();
|
|
38
|
+
const newItemsMap = new Map();
|
|
39
|
+
oldFeed.items.forEach(item => {
|
|
40
|
+
const key = getGuid(item) || item.link || "";
|
|
41
|
+
oldItemsMap.set(key, item);
|
|
42
|
+
});
|
|
43
|
+
newFeed.items.forEach(item => {
|
|
44
|
+
const key = getGuid(item) || item.link || "";
|
|
45
|
+
newItemsMap.set(key, item);
|
|
46
|
+
});
|
|
47
|
+
const added = [];
|
|
48
|
+
const removed = [];
|
|
49
|
+
const modified = [];
|
|
50
|
+
const unchanged = [];
|
|
51
|
+
newFeed.items.forEach(newItem => {
|
|
52
|
+
const key = getGuid(newItem) || newItem.link || "";
|
|
53
|
+
const oldItem = oldItemsMap.get(key);
|
|
54
|
+
if (!oldItem) {
|
|
55
|
+
added.push(newItem);
|
|
56
|
+
}
|
|
57
|
+
else if (JSON.stringify(newItem) !== JSON.stringify(oldItem)) {
|
|
58
|
+
modified.push(newItem);
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
unchanged.push(newItem);
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
oldFeed.items.forEach(oldItem => {
|
|
65
|
+
const key = getGuid(oldItem) || oldItem.link || "";
|
|
66
|
+
if (!newItemsMap.has(key)) {
|
|
67
|
+
removed.push(oldItem);
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
return { added, removed, modified, unchanged };
|
|
71
|
+
}
|
|
72
|
+
export function filterFeed(feed, predicate) {
|
|
73
|
+
return {
|
|
74
|
+
...feed,
|
|
75
|
+
items: feed.items.filter(predicate)
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export function filterByCategory(feed, category) {
|
|
79
|
+
return filterFeed(feed, (item) => {
|
|
80
|
+
if (!item.categories)
|
|
81
|
+
return false;
|
|
82
|
+
const categories = item.categories.map((cat) => typeof cat === 'string' ? cat : cat.name);
|
|
83
|
+
return categories.includes(category);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
export function filterByAuthor(feed, author) {
|
|
87
|
+
return filterFeed(feed, (item) => {
|
|
88
|
+
return item.author === author;
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
export function filterByDateRange(feed, startDate, endDate) {
|
|
92
|
+
return filterFeed(feed, (item) => {
|
|
93
|
+
const itemDate = item.pubDate || item.date;
|
|
94
|
+
if (!itemDate)
|
|
95
|
+
return false;
|
|
96
|
+
const date = new Date(itemDate);
|
|
97
|
+
if (date < startDate)
|
|
98
|
+
return false;
|
|
99
|
+
if (endDate && date > endDate)
|
|
100
|
+
return false;
|
|
101
|
+
return true;
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
export function sortFeed(feed, comparator) {
|
|
105
|
+
return {
|
|
106
|
+
...feed,
|
|
107
|
+
items: [...feed.items].sort(comparator)
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
export function sortByDate(feed, order = 'desc') {
|
|
111
|
+
return sortFeed(feed, (a, b) => {
|
|
112
|
+
const dateA = a.pubDate || a.date;
|
|
113
|
+
const dateB = b.pubDate || b.date;
|
|
114
|
+
if (!dateA && !dateB)
|
|
115
|
+
return 0;
|
|
116
|
+
if (!dateA)
|
|
117
|
+
return 1;
|
|
118
|
+
if (!dateB)
|
|
119
|
+
return -1;
|
|
120
|
+
const aTime = new Date(dateA).getTime();
|
|
121
|
+
const bTime = new Date(dateB).getTime();
|
|
122
|
+
return order === 'desc' ? bTime - aTime : aTime - bTime;
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
export function sortByTitle(feed, order = 'asc') {
|
|
126
|
+
return sortFeed(feed, (a, b) => {
|
|
127
|
+
const titleA = (a.title || "").toLowerCase();
|
|
128
|
+
const titleB = (b.title || "").toLowerCase();
|
|
129
|
+
if (titleA < titleB)
|
|
130
|
+
return order === 'asc' ? -1 : 1;
|
|
131
|
+
if (titleA > titleB)
|
|
132
|
+
return order === 'asc' ? 1 : -1;
|
|
133
|
+
return 0;
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
export function limitFeed(feed, count) {
|
|
137
|
+
return {
|
|
138
|
+
...feed,
|
|
139
|
+
items: feed.items.slice(0, count)
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
export function deduplicateFeed(feed) {
|
|
143
|
+
const seen = new Set();
|
|
144
|
+
const uniqueItems = [];
|
|
145
|
+
feed.items.forEach(item => {
|
|
146
|
+
const key = getGuid(item) || item.link || "";
|
|
147
|
+
if (!seen.has(key)) {
|
|
148
|
+
seen.add(key);
|
|
149
|
+
uniqueItems.push(item);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
return {
|
|
153
|
+
...feed,
|
|
154
|
+
items: uniqueItems
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=feed-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"feed-utils.js","sourceRoot":"","sources":["../../src/util/feed-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
export interface OPMLDocument {
|
|
2
|
+
version?: string;
|
|
3
|
+
title?: string;
|
|
4
|
+
dateCreated?: Date;
|
|
5
|
+
dateModified?: Date;
|
|
6
|
+
ownerName?: string;
|
|
7
|
+
ownerEmail?: string;
|
|
8
|
+
outlines: OPMLOutline[];
|
|
9
|
+
}
|
|
10
|
+
export interface OPMLOutline {
|
|
11
|
+
text?: string;
|
|
12
|
+
title?: string;
|
|
13
|
+
type?: string;
|
|
14
|
+
xmlUrl?: string;
|
|
15
|
+
htmlUrl?: string;
|
|
16
|
+
description?: string;
|
|
17
|
+
category?: string[];
|
|
18
|
+
outlines?: OPMLOutline[];
|
|
19
|
+
}
|
|
20
|
+
export declare class OPMLParser {
|
|
21
|
+
parseOPML(xml: string): Promise<OPMLDocument>;
|
|
22
|
+
private parseOutline;
|
|
23
|
+
}
|
|
24
|
+
export declare class OPMLGenerator {
|
|
25
|
+
generateOPML(opml: OPMLDocument): string;
|
|
26
|
+
private generateOutline;
|
|
27
|
+
private escape;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=opml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opml.d.ts","sourceRoot":"","sources":["../../src/util/opml.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,IAAI,CAAC;IACnB,YAAY,CAAC,EAAE,IAAI,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,WAAW,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAC;CAC1B;AAED,qBAAa,UAAU;IACf,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAwCnD,OAAO,CAAC,YAAY;CAqBrB;AAED,qBAAa,aAAa;IACxB,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM;IAwCxC,OAAO,CAAC,eAAe;IA8CvB,OAAO,CAAC,MAAM;CAQf"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import * as xml2js from "xml2js";
|
|
2
|
+
export class OPMLParser {
|
|
3
|
+
async parseOPML(xml) {
|
|
4
|
+
const parser = new xml2js.Parser({
|
|
5
|
+
explicitArray: true,
|
|
6
|
+
explicitRoot: false
|
|
7
|
+
});
|
|
8
|
+
const result = await parser.parseStringPromise(xml);
|
|
9
|
+
if (!result.opml) {
|
|
10
|
+
throw new Error("Invalid OPML: missing root opml element");
|
|
11
|
+
}
|
|
12
|
+
const opml = result.opml;
|
|
13
|
+
const opmlResult = {
|
|
14
|
+
version: opml.$?.version || "1.0",
|
|
15
|
+
outlines: []
|
|
16
|
+
};
|
|
17
|
+
if (opml.head && opml.head.length > 0) {
|
|
18
|
+
const head = opml.head[0];
|
|
19
|
+
opmlResult.title = head.title ? head.title[0] : undefined;
|
|
20
|
+
if (head.dateCreated) {
|
|
21
|
+
opmlResult.dateCreated = new Date(head.dateCreated[0]);
|
|
22
|
+
}
|
|
23
|
+
if (head.dateModified) {
|
|
24
|
+
opmlResult.dateModified = new Date(head.dateModified[0]);
|
|
25
|
+
}
|
|
26
|
+
opmlResult.ownerName = head.ownerName ? head.ownerName[0] : undefined;
|
|
27
|
+
opmlResult.ownerEmail = head.ownerEmail ? head.ownerEmail[0] : undefined;
|
|
28
|
+
}
|
|
29
|
+
if (opml.body && opml.body.length > 0 && opml.body[0].outline) {
|
|
30
|
+
const outlines = opml.body[0].outline;
|
|
31
|
+
const outlineArray = Array.isArray(outlines) ? outlines : [outlines];
|
|
32
|
+
opmlResult.outlines = outlineArray.map((o) => this.parseOutline(o));
|
|
33
|
+
}
|
|
34
|
+
return opmlResult;
|
|
35
|
+
}
|
|
36
|
+
parseOutline(obj) {
|
|
37
|
+
const outline = {
|
|
38
|
+
text: obj.$?.text,
|
|
39
|
+
title: obj.$?.title,
|
|
40
|
+
type: obj.$?.type,
|
|
41
|
+
xmlUrl: obj.$?.xmlUrl,
|
|
42
|
+
htmlUrl: obj.$?.htmlUrl,
|
|
43
|
+
description: obj.$?.description
|
|
44
|
+
};
|
|
45
|
+
if (obj.$?.category) {
|
|
46
|
+
outline.category = obj.$.category.split(",").map((c) => c.trim());
|
|
47
|
+
}
|
|
48
|
+
if (obj.outline) {
|
|
49
|
+
const outlines = Array.isArray(obj.outline) ? obj.outline : [obj.outline];
|
|
50
|
+
outline.outlines = outlines.map((o) => this.parseOutline(o));
|
|
51
|
+
}
|
|
52
|
+
return outline;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export class OPMLGenerator {
|
|
56
|
+
generateOPML(opml) {
|
|
57
|
+
const headLines = [];
|
|
58
|
+
headLines.push(`<?xml version="1.0" encoding="UTF-8"?>`);
|
|
59
|
+
headLines.push(`<opml version="${opml.version || "1.0"}">`);
|
|
60
|
+
headLines.push(" <head>");
|
|
61
|
+
if (opml.title) {
|
|
62
|
+
headLines.push(` <title>${this.escape(opml.title)}</title>`);
|
|
63
|
+
}
|
|
64
|
+
if (opml.dateCreated) {
|
|
65
|
+
headLines.push(` <dateCreated>${opml.dateCreated.toISOString()}</dateCreated>`);
|
|
66
|
+
}
|
|
67
|
+
if (opml.dateModified) {
|
|
68
|
+
headLines.push(` <dateModified>${opml.dateModified.toISOString()}</dateModified>`);
|
|
69
|
+
}
|
|
70
|
+
if (opml.ownerName) {
|
|
71
|
+
headLines.push(` <ownerName>${this.escape(opml.ownerName)}</ownerName>`);
|
|
72
|
+
}
|
|
73
|
+
if (opml.ownerEmail) {
|
|
74
|
+
headLines.push(` <ownerEmail>${this.escape(opml.ownerEmail)}</ownerEmail>`);
|
|
75
|
+
}
|
|
76
|
+
headLines.push(" </head>");
|
|
77
|
+
headLines.push(" <body>");
|
|
78
|
+
opml.outlines.forEach(outline => {
|
|
79
|
+
headLines.push(this.generateOutline(outline, 4));
|
|
80
|
+
});
|
|
81
|
+
headLines.push(" </body>");
|
|
82
|
+
headLines.push("</opml>");
|
|
83
|
+
return headLines.join("\n");
|
|
84
|
+
}
|
|
85
|
+
generateOutline(outline, indent) {
|
|
86
|
+
const spaces = " ".repeat(indent);
|
|
87
|
+
const attributes = [];
|
|
88
|
+
if (outline.text) {
|
|
89
|
+
attributes.push(`text="${this.escape(outline.text)}"`);
|
|
90
|
+
}
|
|
91
|
+
if (outline.title) {
|
|
92
|
+
attributes.push(`title="${this.escape(outline.title)}"`);
|
|
93
|
+
}
|
|
94
|
+
if (outline.type) {
|
|
95
|
+
attributes.push(`type="${this.escape(outline.type)}"`);
|
|
96
|
+
}
|
|
97
|
+
if (outline.xmlUrl) {
|
|
98
|
+
attributes.push(`xmlUrl="${this.escape(outline.xmlUrl)}"`);
|
|
99
|
+
}
|
|
100
|
+
if (outline.htmlUrl) {
|
|
101
|
+
attributes.push(`htmlUrl="${this.escape(outline.htmlUrl)}"`);
|
|
102
|
+
}
|
|
103
|
+
if (outline.description) {
|
|
104
|
+
attributes.push(`description="${this.escape(outline.description)}"`);
|
|
105
|
+
}
|
|
106
|
+
if (outline.category && outline.category.length > 0) {
|
|
107
|
+
attributes.push(`category="${this.escape(outline.category.join(","))}"`);
|
|
108
|
+
}
|
|
109
|
+
const line = `${spaces}<outline ${attributes.join(" ")}`;
|
|
110
|
+
if (outline.outlines && outline.outlines.length > 0) {
|
|
111
|
+
const childLines = [line + ">"];
|
|
112
|
+
outline.outlines.forEach(child => {
|
|
113
|
+
childLines.push(this.generateOutline(child, indent + 2));
|
|
114
|
+
});
|
|
115
|
+
childLines.push(`${spaces}</outline>`);
|
|
116
|
+
return childLines.join("\n");
|
|
117
|
+
}
|
|
118
|
+
return line + "/>";
|
|
119
|
+
}
|
|
120
|
+
escape(text) {
|
|
121
|
+
return text
|
|
122
|
+
.replace(/&/g, "&")
|
|
123
|
+
.replace(/</g, "<")
|
|
124
|
+
.replace(/>/g, ">")
|
|
125
|
+
.replace(/"/g, """)
|
|
126
|
+
.replace(/'/g, "'");
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=opml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"opml.js","sourceRoot":"","sources":["../../src/util/opml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ParsedFeed } from "../parser";
|
|
2
|
+
export interface ValidationResult {
|
|
3
|
+
valid: boolean;
|
|
4
|
+
errors: string[];
|
|
5
|
+
warnings: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateRSS2(feed: ParsedFeed): ValidationResult;
|
|
8
|
+
export declare function validateAtom(feed: ParsedFeed): ValidationResult;
|
|
9
|
+
export declare function validateJSONFeed(feed: any): ValidationResult;
|
|
10
|
+
//# sourceMappingURL=validator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/util/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CAmE/D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,gBAAgB,CA6C/D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,GAAG,GAAG,gBAAgB,CAqC5D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
export function validateRSS2(feed) {
|
|
2
|
+
const errors = [];
|
|
3
|
+
const warnings = [];
|
|
4
|
+
if (!feed.title) {
|
|
5
|
+
errors.push("Feed title is required");
|
|
6
|
+
}
|
|
7
|
+
if (!feed.description) {
|
|
8
|
+
errors.push("Feed description is required");
|
|
9
|
+
}
|
|
10
|
+
if (!feed.link) {
|
|
11
|
+
errors.push("Feed link is required");
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
try {
|
|
15
|
+
new URL(feed.link);
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
errors.push(`Invalid feed link: ${feed.link}`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
if (!feed.items || feed.items.length === 0) {
|
|
22
|
+
warnings.push("Feed has no items");
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
feed.items.forEach((item, index) => {
|
|
26
|
+
if (!item.title && !item.description) {
|
|
27
|
+
warnings.push(`Item ${index + 1} has no title or description`);
|
|
28
|
+
}
|
|
29
|
+
if (!item.link) {
|
|
30
|
+
warnings.push(`Item ${index + 1} is missing a link`);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
try {
|
|
34
|
+
new URL(item.link);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
errors.push(`Item ${index + 1} has invalid link: ${item.link}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (item.enclosure) {
|
|
41
|
+
if (!item.enclosure.url) {
|
|
42
|
+
errors.push(`Item ${index + 1} enclosure is missing url`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
try {
|
|
46
|
+
new URL(item.enclosure.url);
|
|
47
|
+
}
|
|
48
|
+
catch {
|
|
49
|
+
errors.push(`Item ${index + 1} has invalid enclosure url: ${item.enclosure.url}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (!item.enclosure.type) {
|
|
53
|
+
warnings.push(`Item ${index + 1} enclosure is missing type`);
|
|
54
|
+
}
|
|
55
|
+
if (!item.enclosure.length) {
|
|
56
|
+
warnings.push(`Item ${index + 1} enclosure is missing length`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
valid: errors.length === 0,
|
|
63
|
+
errors,
|
|
64
|
+
warnings
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
export function validateAtom(feed) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
const warnings = [];
|
|
70
|
+
if (!feed.title) {
|
|
71
|
+
errors.push("Feed title is required");
|
|
72
|
+
}
|
|
73
|
+
if (!feed.link && !feed.feedUrl) {
|
|
74
|
+
errors.push("Feed must have either link or feedUrl");
|
|
75
|
+
}
|
|
76
|
+
if (!feed.items || feed.items.length === 0) {
|
|
77
|
+
warnings.push("Feed has no items");
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
feed.items.forEach((item, index) => {
|
|
81
|
+
if (!item.title) {
|
|
82
|
+
warnings.push(`Item ${index + 1} is missing a title`);
|
|
83
|
+
}
|
|
84
|
+
if (!item.link) {
|
|
85
|
+
errors.push(`Item ${index + 1} must have a link`);
|
|
86
|
+
}
|
|
87
|
+
else {
|
|
88
|
+
try {
|
|
89
|
+
new URL(item.link);
|
|
90
|
+
}
|
|
91
|
+
catch {
|
|
92
|
+
errors.push(`Item ${index + 1} has invalid link: ${item.link}`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!item.id) {
|
|
96
|
+
warnings.push(`Item ${index + 1} is missing an id`);
|
|
97
|
+
}
|
|
98
|
+
if (!item.pubDate && !item.date) {
|
|
99
|
+
warnings.push(`Item ${index + 1} is missing a published date`);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
valid: errors.length === 0,
|
|
105
|
+
errors,
|
|
106
|
+
warnings
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
export function validateJSONFeed(feed) {
|
|
110
|
+
const errors = [];
|
|
111
|
+
const warnings = [];
|
|
112
|
+
if (!feed.version) {
|
|
113
|
+
errors.push("Feed version is required");
|
|
114
|
+
}
|
|
115
|
+
else if (!feed.version.includes("jsonfeed.org/version/")) {
|
|
116
|
+
errors.push("Invalid feed version: must include jsonfeed.org/version/");
|
|
117
|
+
}
|
|
118
|
+
if (!feed.title) {
|
|
119
|
+
errors.push("Feed title is required");
|
|
120
|
+
}
|
|
121
|
+
if (!feed.items || feed.items.length === 0) {
|
|
122
|
+
warnings.push("Feed has no items");
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
feed.items.forEach((item, index) => {
|
|
126
|
+
if (!item.id) {
|
|
127
|
+
errors.push(`Item ${index + 1} must have an id`);
|
|
128
|
+
}
|
|
129
|
+
if (!item.url) {
|
|
130
|
+
warnings.push(`Item ${index + 1} is missing a url`);
|
|
131
|
+
}
|
|
132
|
+
if (!item.title && !item.content_html && !item.content_text) {
|
|
133
|
+
warnings.push(`Item ${index + 1} has no title or content`);
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
return {
|
|
138
|
+
valid: errors.length === 0,
|
|
139
|
+
errors,
|
|
140
|
+
warnings
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/util/validator.ts"],"names":[],"mappings":"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"}
|
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAAA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAKpE"}
|