@everipedia/iq-utils 1.0.0 → 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/CHANGELOG.md +12 -0
- package/dist/index.d.mts +1002 -0
- package/dist/index.d.ts +1002 -0
- package/dist/index.js +650 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +600 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +51 -53
- package/build/main/data/constants.d.ts +0 -24
- package/build/main/data/constants.js +0 -28
- package/build/main/index.d.ts +0 -6
- package/build/main/index.js +0 -23
- package/build/main/lib/checkWikiValidity.d.ts +0 -67
- package/build/main/lib/checkWikiValidity.js +0 -209
- package/build/main/lib/helpers/wiki.helpers.d.ts +0 -32
- package/build/main/lib/helpers/wiki.helpers.js +0 -86
- package/build/main/lib/isDeepEqual.d.ts +0 -3
- package/build/main/lib/isDeepEqual.js +0 -53
- package/build/main/lib/wikiScore.d.ts +0 -2
- package/build/main/lib/wikiScore.js +0 -127
- package/build/main/schema/wiki.schema.d.ts +0 -798
- package/build/main/schema/wiki.schema.js +0 -289
- package/build/main/types/wiki.d.ts +0 -9
- package/build/main/types/wiki.js +0 -14
- package/build/main/types/wikiBuilder.d.ts +0 -11
- package/build/main/types/wikiBuilder.js +0 -3
- package/build/module/data/constants.d.ts +0 -24
- package/build/module/data/constants.js +0 -25
- package/build/module/index.d.ts +0 -6
- package/build/module/index.js +0 -7
- package/build/module/lib/checkWikiValidity.d.ts +0 -67
- package/build/module/lib/checkWikiValidity.js +0 -191
- package/build/module/lib/helpers/wiki.helpers.d.ts +0 -32
- package/build/module/lib/helpers/wiki.helpers.js +0 -75
- package/build/module/lib/isDeepEqual.d.ts +0 -3
- package/build/module/lib/isDeepEqual.js +0 -51
- package/build/module/lib/wikiScore.d.ts +0 -2
- package/build/module/lib/wikiScore.js +0 -121
- package/build/module/schema/wiki.schema.d.ts +0 -798
- package/build/module/schema/wiki.schema.js +0 -286
- package/build/module/types/wiki.d.ts +0 -9
- package/build/module/types/wiki.js +0 -11
- package/build/module/types/wikiBuilder.d.ts +0 -11
- package/build/module/types/wikiBuilder.js +0 -2
|
@@ -1,191 +0,0 @@
|
|
|
1
|
-
import { IPFS_HASH_LENGTH, MAX_MEDIA_COUNT, MEDIA_UPLOAD_PENDING_SUFFIX, WIKI_CONTENT_MIN_WORDS, WIKI_SUMMARY_MAX_LENGTH, WIKI_TITLE_MAX_LENGTH, } from "../data/constants";
|
|
2
|
-
import { CommonMetaIdsEnum, MediaSourceEnum, MediaTypeEnum, } from "../schema/wiki.schema";
|
|
3
|
-
import { whiteListedDomains, whiteListedLinkNames } from "../types/wiki";
|
|
4
|
-
/**
|
|
5
|
-
* Counts the number of words in a given string.
|
|
6
|
-
* @param text - The input string to count words from.
|
|
7
|
-
* @returns The number of words in the string.
|
|
8
|
-
*/
|
|
9
|
-
export const countWords = (text) => text.split(" ").filter((word) => word !== "").length;
|
|
10
|
-
/**
|
|
11
|
-
* Checks if a given string is a valid URL.
|
|
12
|
-
* @param urlString - The string to check.
|
|
13
|
-
* @returns True if the string is a valid URL, false otherwise.
|
|
14
|
-
*/
|
|
15
|
-
export const isValidUrl = (urlString) => {
|
|
16
|
-
try {
|
|
17
|
-
return Boolean(new URL(urlString));
|
|
18
|
-
}
|
|
19
|
-
catch (_e) {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* Checks if all content links in the given text are verified.
|
|
25
|
-
* @param content - The content to check for links.
|
|
26
|
-
* @returns True if all links are verified, false otherwise.
|
|
27
|
-
*/
|
|
28
|
-
export const areContentLinksVerified = (content) => {
|
|
29
|
-
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
30
|
-
return (markdownLinks?.every((link) => {
|
|
31
|
-
const [, linkText, linkUrl] = RegExp(/\[(.*?)\]\((.*?)\)/).exec(link) || [];
|
|
32
|
-
if (linkText &&
|
|
33
|
-
linkUrl &&
|
|
34
|
-
whiteListedLinkNames.includes(linkText) &&
|
|
35
|
-
!isValidUrl(linkUrl)) {
|
|
36
|
-
return true;
|
|
37
|
-
}
|
|
38
|
-
if (linkUrl && !linkUrl.startsWith("#")) {
|
|
39
|
-
const validDomainPattern = new RegExp(`^https?://(www\\.)?(${whiteListedDomains.join("|")})`);
|
|
40
|
-
return validDomainPattern.test(linkUrl);
|
|
41
|
-
}
|
|
42
|
-
return true;
|
|
43
|
-
}) ?? true);
|
|
44
|
-
};
|
|
45
|
-
/**
|
|
46
|
-
* Checks if the media in the wiki is valid.
|
|
47
|
-
* @param wiki - The wiki object to check.
|
|
48
|
-
* @returns True if the media is valid, false otherwise.
|
|
49
|
-
*/
|
|
50
|
-
export const isMediaValid = (wiki) => {
|
|
51
|
-
if (!wiki.media)
|
|
52
|
-
return true;
|
|
53
|
-
const isMediaContentValid = wiki.media.every((media) => {
|
|
54
|
-
if (media.source === MediaSourceEnum.Enum.IPFS_IMG ||
|
|
55
|
-
media.source === MediaSourceEnum.Enum.IPFS_VID) {
|
|
56
|
-
return media.id.length === IPFS_HASH_LENGTH;
|
|
57
|
-
}
|
|
58
|
-
if (media.source === MediaSourceEnum.Enum.YOUTUBE) {
|
|
59
|
-
const youtubePattern = /^.*(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/|shorts\/|watch\?v=)([^#&?]*).*/;
|
|
60
|
-
return (media.id === `https://www.youtube.com/watch?v=${media.name}` &&
|
|
61
|
-
youtubePattern.test(media.id));
|
|
62
|
-
}
|
|
63
|
-
if (media.source === MediaSourceEnum.Enum.VIMEO) {
|
|
64
|
-
return media.id === `https://vimeo.com/${media.name}`;
|
|
65
|
-
}
|
|
66
|
-
return media.type
|
|
67
|
-
? Object.values(MediaTypeEnum).includes(media.type)
|
|
68
|
-
: true;
|
|
69
|
-
});
|
|
70
|
-
const iconMediaCount = wiki.media.filter((media) => media.type === MediaTypeEnum.Enum.ICON).length;
|
|
71
|
-
return (wiki.media.length <= MAX_MEDIA_COUNT &&
|
|
72
|
-
isMediaContentValid &&
|
|
73
|
-
iconMediaCount <= 1);
|
|
74
|
-
};
|
|
75
|
-
/**
|
|
76
|
-
* Checks if any media in the wiki is still uploading.
|
|
77
|
-
* @param wiki - The wiki object to check.
|
|
78
|
-
* @returns True if any media is still uploading, false otherwise.
|
|
79
|
-
*/
|
|
80
|
-
export const isAnyMediaUploading = (wiki) => wiki.media?.some((media) => media.id.endsWith(MEDIA_UPLOAD_PENDING_SUFFIX)) ??
|
|
81
|
-
false;
|
|
82
|
-
/**
|
|
83
|
-
* Checks if the event URL is missing for an event wiki.
|
|
84
|
-
* @param wiki - The wiki object to check.
|
|
85
|
-
* @returns True if the event URL is missing, false otherwise.
|
|
86
|
-
*/
|
|
87
|
-
export const isEventUrlMissing = (wiki) => {
|
|
88
|
-
if (wiki.tags.some((tag) => tag.id === "Events")) {
|
|
89
|
-
const referencesData = wiki.metadata.find((meta) => meta.id === CommonMetaIdsEnum.Enum.references)?.value || "[]";
|
|
90
|
-
const references = JSON.parse(referencesData);
|
|
91
|
-
return !references.some((item) => item.description.toLowerCase() === "event link");
|
|
92
|
-
}
|
|
93
|
-
return false;
|
|
94
|
-
};
|
|
95
|
-
/**
|
|
96
|
-
* Checks if the event date is missing for an event wiki.
|
|
97
|
-
* @param wiki - The wiki object to check.
|
|
98
|
-
* @returns True if the event date is missing, false otherwise.
|
|
99
|
-
*/
|
|
100
|
-
export const isEventDateMissing = (wiki) => wiki.tags.some((tag) => tag.id === "Events") && wiki.events?.length === 0;
|
|
101
|
-
/**
|
|
102
|
-
* Checks if the wiki summary exceeds the maximum length.
|
|
103
|
-
* @param wiki - The wiki object to check.
|
|
104
|
-
* @returns True if the summary exceeds the limit, false otherwise.
|
|
105
|
-
*/
|
|
106
|
-
export const isSummaryTooLong = (wiki) => !!(wiki.summary && wiki.summary.length > WIKI_SUMMARY_MAX_LENGTH);
|
|
107
|
-
/**
|
|
108
|
-
* Checks if the wiki has no citations.
|
|
109
|
-
* @param wiki - The wiki object to check.
|
|
110
|
-
* @returns True if there are no citations, false otherwise.
|
|
111
|
-
*/
|
|
112
|
-
export const hasNoCitations = (wiki) => {
|
|
113
|
-
const references = wiki.metadata.find((meta) => meta.id === CommonMetaIdsEnum.Enum.references);
|
|
114
|
-
return !references?.value || references.value.length === 0;
|
|
115
|
-
};
|
|
116
|
-
/**
|
|
117
|
-
* Validates a wiki object and returns the validation result.
|
|
118
|
-
* @param wiki - The wiki object to validate.
|
|
119
|
-
* @returns An object containing the validation result and an error message if applicable.
|
|
120
|
-
*/
|
|
121
|
-
export const validateWiki = (wiki) => {
|
|
122
|
-
const wordCount = countWords(wiki.content || "");
|
|
123
|
-
if (!wiki.title) {
|
|
124
|
-
return {
|
|
125
|
-
isValid: false,
|
|
126
|
-
error: "Add a Title at the top for this Wiki to continue",
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (wiki.title.length > WIKI_TITLE_MAX_LENGTH) {
|
|
130
|
-
return {
|
|
131
|
-
isValid: false,
|
|
132
|
-
error: `Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
if (!wiki.content) {
|
|
136
|
-
return { isValid: false, error: "Add a Content section to continue" };
|
|
137
|
-
}
|
|
138
|
-
if (wordCount < WIKI_CONTENT_MIN_WORDS) {
|
|
139
|
-
return {
|
|
140
|
-
isValid: false,
|
|
141
|
-
error: `Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue. You have written ${wordCount}`,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
if (!areContentLinksVerified(wiki.content)) {
|
|
145
|
-
return {
|
|
146
|
-
isValid: false,
|
|
147
|
-
error: "Please remove all external links from the content",
|
|
148
|
-
};
|
|
149
|
-
}
|
|
150
|
-
if (!wiki.images?.length) {
|
|
151
|
-
return {
|
|
152
|
-
isValid: false,
|
|
153
|
-
error: "Add a main image on the right column to continue",
|
|
154
|
-
};
|
|
155
|
-
}
|
|
156
|
-
if (wiki.categories.length === 0) {
|
|
157
|
-
return { isValid: false, error: "Add one category to continue" };
|
|
158
|
-
}
|
|
159
|
-
if (isSummaryTooLong(wiki)) {
|
|
160
|
-
return {
|
|
161
|
-
isValid: false,
|
|
162
|
-
error: `Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,
|
|
163
|
-
};
|
|
164
|
-
}
|
|
165
|
-
if (isAnyMediaUploading(wiki)) {
|
|
166
|
-
return {
|
|
167
|
-
isValid: false,
|
|
168
|
-
error: "Some media are still uploading, please wait",
|
|
169
|
-
};
|
|
170
|
-
}
|
|
171
|
-
if (hasNoCitations(wiki)) {
|
|
172
|
-
return { isValid: false, error: "Please add at least one citation" };
|
|
173
|
-
}
|
|
174
|
-
if (isEventUrlMissing(wiki)) {
|
|
175
|
-
return {
|
|
176
|
-
isValid: false,
|
|
177
|
-
error: "Please cite the event official website with 'Event Link' description",
|
|
178
|
-
};
|
|
179
|
-
}
|
|
180
|
-
if (isEventDateMissing(wiki)) {
|
|
181
|
-
return {
|
|
182
|
-
isValid: false,
|
|
183
|
-
error: 'Please open the "Edit Wiki Details Modal" and enter a valid event date',
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
if (!isMediaValid(wiki)) {
|
|
187
|
-
return { isValid: false, error: "Media is invalid" };
|
|
188
|
-
}
|
|
189
|
-
return { isValid: true };
|
|
190
|
-
};
|
|
191
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hlY2tXaWtpVmFsaWRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2NoZWNrV2lraVZhbGlkaXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTixnQkFBZ0IsRUFDaEIsZUFBZSxFQUNmLDJCQUEyQixFQUMzQixzQkFBc0IsRUFDdEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixHQUNyQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTixpQkFBaUIsRUFDakIsZUFBZSxFQUNmLGFBQWEsR0FFYixNQUFNLHVCQUF1QixDQUFDO0FBQy9CLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUV6RTs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBWSxFQUFFLEVBQUUsQ0FDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUM7QUFFdEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRTtJQUMvQyxJQUFJO1FBQ0gsT0FBTyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztLQUNuQztJQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ1osT0FBTyxLQUFLLENBQUM7S0FDYjtBQUNGLENBQUMsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLE9BQWUsRUFBRSxFQUFFO0lBQzFELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUMzRCxPQUFPLENBQ04sYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDLElB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
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import type { z } from "zod";
|
|
2
|
-
import { type Media, type TagEnum } from "../../schema/wiki.schema";
|
|
3
|
-
/**
|
|
4
|
-
* Counts the number of words in a given string.
|
|
5
|
-
* @param text - The input string to count words from.
|
|
6
|
-
* @returns The number of words in the string.
|
|
7
|
-
*/
|
|
8
|
-
export declare const countWords: (text: string) => number;
|
|
9
|
-
/**
|
|
10
|
-
* Checks if a given string is a valid URL.
|
|
11
|
-
* @param urlString - The string to check.
|
|
12
|
-
* @returns True if the string is a valid URL, false otherwise.
|
|
13
|
-
*/
|
|
14
|
-
export declare const isValidUrl: (urlString: string) => boolean;
|
|
15
|
-
export declare const validateMediaContent: (media: Media[]) => boolean;
|
|
16
|
-
export declare const validateMediaCount: (media: Media[]) => boolean;
|
|
17
|
-
export declare const validateEventWiki: (wiki: {
|
|
18
|
-
tags: {
|
|
19
|
-
id: z.infer<typeof TagEnum>;
|
|
20
|
-
}[];
|
|
21
|
-
metadata: {
|
|
22
|
-
id: string;
|
|
23
|
-
value?: string;
|
|
24
|
-
}[];
|
|
25
|
-
events?: unknown[];
|
|
26
|
-
}) => boolean;
|
|
27
|
-
/**
|
|
28
|
-
* Checks if all content links in the given text are verified.
|
|
29
|
-
* @param content - The content to check for links.
|
|
30
|
-
* @returns True if all links are verified, false otherwise.
|
|
31
|
-
*/
|
|
32
|
-
export declare const areContentLinksVerified: (content: string) => boolean;
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { IPFS_HASH_LENGTH, MAX_MEDIA_COUNT } from "../../data/constants";
|
|
2
|
-
import { CommonMetaIdsEnum, MediaSourceEnum, MediaTypeEnum, } from "../../schema/wiki.schema";
|
|
3
|
-
import { whiteListedDomains, whiteListedLinkNames } from "../../types/wiki";
|
|
4
|
-
/**
|
|
5
|
-
* Counts the number of words in a given string.
|
|
6
|
-
* @param text - The input string to count words from.
|
|
7
|
-
* @returns The number of words in the string.
|
|
8
|
-
*/
|
|
9
|
-
export const countWords = (text) => text.split(" ").filter((word) => word !== "").length;
|
|
10
|
-
/**
|
|
11
|
-
* Checks if a given string is a valid URL.
|
|
12
|
-
* @param urlString - The string to check.
|
|
13
|
-
* @returns True if the string is a valid URL, false otherwise.
|
|
14
|
-
*/
|
|
15
|
-
export const isValidUrl = (urlString) => {
|
|
16
|
-
try {
|
|
17
|
-
return Boolean(new URL(urlString));
|
|
18
|
-
}
|
|
19
|
-
catch (_e) {
|
|
20
|
-
return false;
|
|
21
|
-
}
|
|
22
|
-
};
|
|
23
|
-
export const validateMediaContent = (media) => {
|
|
24
|
-
return media.every((item) => {
|
|
25
|
-
if (item.source === MediaSourceEnum.Enum.IPFS_IMG ||
|
|
26
|
-
item.source === MediaSourceEnum.Enum.IPFS_VID) {
|
|
27
|
-
return item.id.length === IPFS_HASH_LENGTH;
|
|
28
|
-
}
|
|
29
|
-
if (item.source === MediaSourceEnum.Enum.YOUTUBE) {
|
|
30
|
-
const youtubePattern = /^.*(?:youtu\.be\/|v\/|vi\/|u\/\w\/|embed\/|shorts\/|watch\?v=)([^#&?]*).*/;
|
|
31
|
-
return (item.id === `https://www.youtube.com/watch?v=${item.name}` &&
|
|
32
|
-
youtubePattern.test(item.id));
|
|
33
|
-
}
|
|
34
|
-
if (item.source === MediaSourceEnum.Enum.VIMEO) {
|
|
35
|
-
return item.id === `https://vimeo.com/${item.name}`;
|
|
36
|
-
}
|
|
37
|
-
return item.type ? item.type in MediaTypeEnum : true;
|
|
38
|
-
});
|
|
39
|
-
};
|
|
40
|
-
export const validateMediaCount = (media) => {
|
|
41
|
-
const iconMediaCount = media.filter((item) => item.type === MediaTypeEnum.Enum.ICON).length;
|
|
42
|
-
return media.length <= MAX_MEDIA_COUNT && iconMediaCount <= 1;
|
|
43
|
-
};
|
|
44
|
-
export const validateEventWiki = (wiki) => {
|
|
45
|
-
if (wiki.tags.some((tag) => tag.id === "Events")) {
|
|
46
|
-
const referencesData = wiki.metadata.find((meta) => meta.id === CommonMetaIdsEnum.Enum.references)?.value || "[]";
|
|
47
|
-
const references = JSON.parse(referencesData);
|
|
48
|
-
const hasEventLink = references.some((item) => item.description.toLowerCase() === "event link");
|
|
49
|
-
return hasEventLink && Array.isArray(wiki.events) && wiki.events.length > 0;
|
|
50
|
-
}
|
|
51
|
-
return true;
|
|
52
|
-
};
|
|
53
|
-
/**
|
|
54
|
-
* Checks if all content links in the given text are verified.
|
|
55
|
-
* @param content - The content to check for links.
|
|
56
|
-
* @returns True if all links are verified, false otherwise.
|
|
57
|
-
*/
|
|
58
|
-
export const areContentLinksVerified = (content) => {
|
|
59
|
-
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
60
|
-
return (markdownLinks?.every((link) => {
|
|
61
|
-
const [, linkText, linkUrl] = RegExp(/\[(.*?)\]\((.*?)\)/).exec(link) || [];
|
|
62
|
-
if (linkText &&
|
|
63
|
-
linkUrl &&
|
|
64
|
-
whiteListedLinkNames.includes(linkText) &&
|
|
65
|
-
!isValidUrl(linkUrl)) {
|
|
66
|
-
return true;
|
|
67
|
-
}
|
|
68
|
-
if (linkUrl && !linkUrl.startsWith("#")) {
|
|
69
|
-
const validDomainPattern = new RegExp(`^https?://(www\\.)?(${whiteListedDomains.join("|")})`);
|
|
70
|
-
return validDomainPattern.test(linkUrl);
|
|
71
|
-
}
|
|
72
|
-
return true;
|
|
73
|
-
}) ?? true);
|
|
74
|
-
};
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lraS5oZWxwZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9oZWxwZXJzL3dpa2kuaGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsZUFBZSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUNOLGlCQUFpQixFQUVqQixlQUFlLEVBQ2YsYUFBYSxHQUViLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLGtCQUFrQixFQUFFLG9CQUFvQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUU7Ozs7R0FJRztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQVksRUFBRSxFQUFFLENBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLEtBQUssRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO0FBRXREOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxTQUFpQixFQUFFLEVBQUU7SUFDL0MsSUFBSTtRQUNILE9BQU8sT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7S0FDbkM7SUFBQyxPQUFPLEVBQUUsRUFBRTtRQUNaLE9BQU8sS0FBSyxDQUFDO0tBQ2I7QUFDRixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxDQUFDLEtBQWMsRUFBRSxFQUFFO0lBQ3RELE9BQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1FBQzNCLElBQ0MsSUFBSSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFDN0MsSUFBSSxDQUFDLE1BQU0sS0FBSyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFDNUM7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
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
function isDeepEqual(baseObject, comparisonObject) {
|
|
2
|
-
return compareValues(baseObject, comparisonObject);
|
|
3
|
-
}
|
|
4
|
-
function compareValues(base, comparison) {
|
|
5
|
-
if (base === comparison) {
|
|
6
|
-
return true;
|
|
7
|
-
}
|
|
8
|
-
if (base == null || comparison == null) {
|
|
9
|
-
return false;
|
|
10
|
-
}
|
|
11
|
-
if (typeof base !== typeof comparison) {
|
|
12
|
-
return false;
|
|
13
|
-
}
|
|
14
|
-
if (typeof base === "string") {
|
|
15
|
-
return compareStrings(base, comparison);
|
|
16
|
-
}
|
|
17
|
-
if (base instanceof Date && comparison instanceof Date) {
|
|
18
|
-
return base.getTime() === comparison.getTime();
|
|
19
|
-
}
|
|
20
|
-
if (base instanceof RegExp && comparison instanceof RegExp) {
|
|
21
|
-
return base.toString() === comparison.toString();
|
|
22
|
-
}
|
|
23
|
-
if (typeof base === "object") {
|
|
24
|
-
return compareObjects(base, comparison);
|
|
25
|
-
}
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
function compareStrings(base, comparison) {
|
|
29
|
-
return base.replace(/\s+/g, "") === comparison.replace(/\s+/g, "");
|
|
30
|
-
}
|
|
31
|
-
function compareObjects(base, comparison) {
|
|
32
|
-
const baseKeys = Object.keys(base);
|
|
33
|
-
const comparisonKeys = Object.keys(comparison);
|
|
34
|
-
if (baseKeys.length !== comparisonKeys.length) {
|
|
35
|
-
return false;
|
|
36
|
-
}
|
|
37
|
-
return baseKeys.every((key) => {
|
|
38
|
-
if (!Object.prototype.hasOwnProperty.call(comparison, key)) {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
const baseValue = base[key];
|
|
42
|
-
const comparisonValue = comparison[key];
|
|
43
|
-
if (typeof baseValue === "function" &&
|
|
44
|
-
typeof comparisonValue === "function") {
|
|
45
|
-
return baseValue.toString() === comparisonValue.toString();
|
|
46
|
-
}
|
|
47
|
-
return compareValues(baseValue, comparisonValue);
|
|
48
|
-
});
|
|
49
|
-
}
|
|
50
|
-
export default isDeepEqual;
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNEZWVwRXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL2lzRGVlcEVxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLFNBQVMsV0FBVyxDQUNuQixVQUEwQixFQUMxQixnQkFBZ0M7SUFFaEMsT0FBTyxhQUFhLENBQUMsVUFBVSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUNyQixJQUFvQixFQUNwQixVQUEwQjtJQUUxQixJQUFJLElBQUksS0FBSyxVQUFVLEVBQUU7UUFDeEIsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUVELElBQUksSUFBSSxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDO0tBQ2I7SUFFRCxJQUFJLE9BQU8sSUFBSSxLQUFLLE9BQU8sVUFBVSxFQUFFO1FBQ3RDLE9BQU8sS0FBSyxDQUFDO0tBQ2I7SUFFRCxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBb0IsQ0FBQyxDQUFDO0tBQ2xEO0lBRUQsSUFBSSxJQUFJLFlBQVksSUFBSSxJQUFJLFVBQVUsWUFBWSxJQUFJLEVBQUU7UUFDdkQsT0FBTyxJQUFJLENBQUMsT0FBTyxFQUFFLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQy9DO0lBRUQsSUFBSSxJQUFJLFlBQVksTUFBTSxJQUFJLFVBQVUsWUFBWSxNQUFNLEVBQUU7UUFDM0QsT0FBTyxJQUFJLENBQUMsUUFBUSxFQUFFLEtBQUssVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0tBQ2pEO0lBRUQsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLEVBQUU7UUFDN0IsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQW9CLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUFDLElBQVksRUFBRSxVQUFrQjtJQUN2RCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxJQUFZLEVBQUUsVUFBa0I7SUFDdkQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLElBQUksUUFBUSxDQUFDLE1BQU0sS0FBSyxjQUFjLENBQUMsTUFBTSxFQUFFO1FBQzlDLE9BQU8sS0FBSyxDQUFDO0tBQ2I7SUFFRCxPQUFPLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUM3QixJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxHQUFHLENBQUMsRUFBRTtZQUMzRCxPQUFPLEtBQUssQ0FBQztTQUNiO1FBRUQsTUFBTSxTQUFTLEdBQUksSUFBdUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRSxNQUFNLGVBQWUsR0FBSSxVQUE2QyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTVFLElBQ0MsT0FBTyxTQUFTLEtBQUssVUFBVTtZQUMvQixPQUFPLGVBQWUsS0FBSyxVQUFVLEVBQ3BDO1lBQ0QsT0FBTyxTQUFTLENBQUMsUUFBUSxFQUFFLEtBQUssZUFBZSxDQUFDLFFBQVEsRUFBRSxDQUFDO1NBQzNEO1FBRUQsT0FBTyxhQUFhLENBQUMsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2xELENBQUMsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVELGVBQWUsV0FBVyxDQUFDIn0=
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
import { CITATIONS_SCORE_WEIGHT, CONTENT_SCORE_WEIGHT, GOOD_CONTENT_WORD_COUNT, IDEAL_CITATIONS_COUNT, IDEAL_CONTENT_WORD_COUNT, IDEAL_INTERNAL_LINKS_COUNT, IDEAL_MEDIA_COUNT, IDEAL_SOCIAL_MEDIA_COUNT, IDEAL_SUMMARY_LENGTH, IDEAL_TAGS_COUNT, INTERNAL_LINKS_SCORE_WEIGHT, MEDIA_SCORE_WEIGHT, MIN_CONTENT_WORD_COUNT, SOCIAL_SCORE_WEIGHT, SUMMARY_SCORE_WEIGHT, TAGS_SCORE_WEIGHT, } from "../data/constants";
|
|
2
|
-
import { CommonMetaIdsEnum, WikiPossibleSocialsList, } from "../schema/wiki.schema";
|
|
3
|
-
const contentQuality = (wordCount) => {
|
|
4
|
-
const scoreMin = 0.0;
|
|
5
|
-
const scoreMax = 1.0;
|
|
6
|
-
let score = 0;
|
|
7
|
-
if (wordCount < MIN_CONTENT_WORD_COUNT) {
|
|
8
|
-
return scoreMin;
|
|
9
|
-
}
|
|
10
|
-
if (wordCount >= MIN_CONTENT_WORD_COUNT &&
|
|
11
|
-
wordCount <= GOOD_CONTENT_WORD_COUNT) {
|
|
12
|
-
score = wordCount / GOOD_CONTENT_WORD_COUNT;
|
|
13
|
-
score *= 0.8;
|
|
14
|
-
}
|
|
15
|
-
if (wordCount > GOOD_CONTENT_WORD_COUNT &&
|
|
16
|
-
wordCount < IDEAL_CONTENT_WORD_COUNT) {
|
|
17
|
-
const baseScore = 0.8;
|
|
18
|
-
const wordCountAboveGood = wordCount - GOOD_CONTENT_WORD_COUNT;
|
|
19
|
-
const extraScoreFactor = wordCountAboveGood / (IDEAL_CONTENT_WORD_COUNT - GOOD_CONTENT_WORD_COUNT);
|
|
20
|
-
const extraScore = Math.sqrt(extraScoreFactor) * 0.2;
|
|
21
|
-
score = baseScore + extraScore;
|
|
22
|
-
}
|
|
23
|
-
if (wordCount >= IDEAL_CONTENT_WORD_COUNT) {
|
|
24
|
-
return scoreMax;
|
|
25
|
-
}
|
|
26
|
-
if (score < scoreMin) {
|
|
27
|
-
return scoreMin;
|
|
28
|
-
}
|
|
29
|
-
if (score > scoreMax) {
|
|
30
|
-
return scoreMax;
|
|
31
|
-
}
|
|
32
|
-
return score;
|
|
33
|
-
};
|
|
34
|
-
const countQuality = (idealCount, realCount) => {
|
|
35
|
-
const scoreMin = 0.0;
|
|
36
|
-
const scoreMax = 1.0;
|
|
37
|
-
const score = realCount / idealCount;
|
|
38
|
-
if (score < scoreMin) {
|
|
39
|
-
return scoreMin;
|
|
40
|
-
}
|
|
41
|
-
if (score > scoreMax) {
|
|
42
|
-
return scoreMax;
|
|
43
|
-
}
|
|
44
|
-
return score;
|
|
45
|
-
};
|
|
46
|
-
const getHostnameFromRegex = (url) => {
|
|
47
|
-
const matches = RegExp(/^https?:\/\/([^/?#]+)(?:[/?#]|$)/i).exec(url);
|
|
48
|
-
return matches?.[1];
|
|
49
|
-
};
|
|
50
|
-
const getWikiInternalLinks = (content) => {
|
|
51
|
-
const markdownLinkRegex = /\[(.*?)\]\((.*?)\)/g;
|
|
52
|
-
let internalLinksCount = 0;
|
|
53
|
-
let match = markdownLinkRegex.exec(content);
|
|
54
|
-
while (match !== null) {
|
|
55
|
-
const url = match[2];
|
|
56
|
-
if (url && !url.startsWith("#")) {
|
|
57
|
-
const hostname = getHostnameFromRegex(url);
|
|
58
|
-
if (hostname === "everipedia.org" ||
|
|
59
|
-
hostname === "iq.wiki" ||
|
|
60
|
-
hostname?.endsWith(".everipedia.org")) {
|
|
61
|
-
internalLinksCount++;
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
match = markdownLinkRegex.exec(content); // Move assignment here
|
|
65
|
-
}
|
|
66
|
-
return internalLinksCount;
|
|
67
|
-
};
|
|
68
|
-
const getWikiCitationLinks = (wiki) => {
|
|
69
|
-
const rawWikiReferences = wiki.metadata.find((m) => m.id === CommonMetaIdsEnum.Enum.references)?.value;
|
|
70
|
-
if (rawWikiReferences === undefined ||
|
|
71
|
-
rawWikiReferences?.trim().length === 0) {
|
|
72
|
-
return 0;
|
|
73
|
-
}
|
|
74
|
-
const wikiReferences = JSON.parse(rawWikiReferences);
|
|
75
|
-
return wikiReferences.length;
|
|
76
|
-
};
|
|
77
|
-
const getSocialsCount = (wiki) => {
|
|
78
|
-
let socialsCount = 0;
|
|
79
|
-
for (const meta of wiki.metadata) {
|
|
80
|
-
if (WikiPossibleSocialsList.includes(meta.id)) {
|
|
81
|
-
if (meta.value) {
|
|
82
|
-
socialsCount += 1;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return socialsCount;
|
|
87
|
-
};
|
|
88
|
-
export const calculateWikiScore = (wiki) => {
|
|
89
|
-
const wordCount = wiki.content.split(" ").length;
|
|
90
|
-
const internalLinksCount = getWikiInternalLinks(wiki.content);
|
|
91
|
-
const citationCount = getWikiCitationLinks(wiki);
|
|
92
|
-
const mediaCount = wiki.media?.length || 0;
|
|
93
|
-
const tagsCount = wiki.tags?.length || 0;
|
|
94
|
-
const summaryWordCount = wiki.summary?.length || 0;
|
|
95
|
-
const socialsCount = getSocialsCount(wiki);
|
|
96
|
-
const contentScore = contentQuality(wordCount);
|
|
97
|
-
const internalLinksScore = countQuality(IDEAL_INTERNAL_LINKS_COUNT, internalLinksCount);
|
|
98
|
-
const citationScore = countQuality(IDEAL_CITATIONS_COUNT, citationCount);
|
|
99
|
-
const mediaScore = countQuality(IDEAL_MEDIA_COUNT, mediaCount);
|
|
100
|
-
const tagsScore = countQuality(IDEAL_TAGS_COUNT, tagsCount);
|
|
101
|
-
const summaryScore = countQuality(IDEAL_SUMMARY_LENGTH, summaryWordCount);
|
|
102
|
-
const socialsScore = countQuality(IDEAL_SOCIAL_MEDIA_COUNT, socialsCount);
|
|
103
|
-
const sumOfWeights = CONTENT_SCORE_WEIGHT +
|
|
104
|
-
INTERNAL_LINKS_SCORE_WEIGHT +
|
|
105
|
-
CITATIONS_SCORE_WEIGHT +
|
|
106
|
-
MEDIA_SCORE_WEIGHT +
|
|
107
|
-
TAGS_SCORE_WEIGHT +
|
|
108
|
-
SUMMARY_SCORE_WEIGHT +
|
|
109
|
-
SOCIAL_SCORE_WEIGHT;
|
|
110
|
-
const score = (contentScore * CONTENT_SCORE_WEIGHT +
|
|
111
|
-
internalLinksScore * INTERNAL_LINKS_SCORE_WEIGHT +
|
|
112
|
-
citationScore * CITATIONS_SCORE_WEIGHT +
|
|
113
|
-
mediaScore * MEDIA_SCORE_WEIGHT +
|
|
114
|
-
tagsScore * TAGS_SCORE_WEIGHT +
|
|
115
|
-
summaryScore * SUMMARY_SCORE_WEIGHT +
|
|
116
|
-
socialsScore * SOCIAL_SCORE_WEIGHT) /
|
|
117
|
-
sumOfWeights;
|
|
118
|
-
const percentScore = Math.floor(score * 100);
|
|
119
|
-
return percentScore;
|
|
120
|
-
};
|
|
121
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2lraVNjb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi93aWtpU2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLHNCQUFzQixFQUN0QixvQkFBb0IsRUFDcEIsdUJBQXVCLEVBQ3ZCLHFCQUFxQixFQUNyQix3QkFBd0IsRUFDeEIsMEJBQTBCLEVBQzFCLGlCQUFpQixFQUNqQix3QkFBd0IsRUFDeEIsb0JBQW9CLEVBQ3BCLGdCQUFnQixFQUNoQiwyQkFBMkIsRUFDM0Isa0JBQWtCLEVBQ2xCLHNCQUFzQixFQUN0QixtQkFBbUIsRUFDbkIsb0JBQW9CLEVBQ3BCLGlCQUFpQixHQUNqQixNQUFNLG1CQUFtQixDQUFDO0FBQzNCLE9BQU8sRUFDTixpQkFBaUIsRUFFakIsdUJBQXVCLEdBQ3ZCLE1BQU0sdUJBQXVCLENBQUM7QUFFL0IsTUFBTSxjQUFjLEdBQUcsQ0FBQyxTQUFpQixFQUFVLEVBQUU7SUFDcEQsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDO0lBQ3JCLE1BQU0sUUFBUSxHQUFHLEdBQUcsQ0FBQztJQUVyQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFZCxJQUFJLFNBQVMsR0FBRyxzQkFBc0IsRUFBRTtRQUN2QyxPQUFPLFFBQVEsQ0FBQztLQUNoQjtJQUVELElBQ0MsU0FBUyxJQUFJLHNCQUFzQjtRQUNuQyxTQUFTLElBQUksdUJBQXVCLEVBQ25DO1FBQ0QsS0FBSyxHQUFHLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztRQUM1QyxLQUFLLElBQUksR0FBRyxDQUFDO0tBQ2I7SUFFRCxJQUNDLFNBQVMsR0FBRyx1QkFBdUI7UUFDbkMsU0FBUyxHQUFHLHdCQUF3QixFQUNuQztRQUNELE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQztRQUN0QixNQUFNLGtCQUFrQixHQUFHLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztRQUMvRCxNQUFNLGdCQUFnQixHQUNyQixrQkFBa0IsR0FB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
|