@everipedia/iq-utils 2.3.0 → 2.4.1
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 +61 -16
- package/dist/index.d.ts +61 -16
- package/dist/index.js +82 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +65 -21
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -1
package/CHANGELOG.md
CHANGED
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import OAuth from 'oauth-1.0a';
|
|
3
|
+
import * as axios from 'axios';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* ========================
|
|
@@ -221,7 +223,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
221
223
|
}, {
|
|
222
224
|
id: string;
|
|
223
225
|
}>, "many">, {
|
|
224
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
226
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
225
227
|
}[], {
|
|
226
228
|
id: string;
|
|
227
229
|
}[]>;
|
|
@@ -376,7 +378,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
376
378
|
title: string;
|
|
377
379
|
}[];
|
|
378
380
|
tags: {
|
|
379
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
381
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
380
382
|
}[];
|
|
381
383
|
metadata: {
|
|
382
384
|
id: string;
|
|
@@ -486,7 +488,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
486
488
|
title: string;
|
|
487
489
|
}[];
|
|
488
490
|
tags: {
|
|
489
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
491
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
490
492
|
}[];
|
|
491
493
|
metadata: {
|
|
492
494
|
id: string;
|
|
@@ -604,18 +606,6 @@ type Reference = z.infer<typeof Reference>;
|
|
|
604
606
|
|
|
605
607
|
declare const calculateWikiScore: (wiki: Wiki) => number;
|
|
606
608
|
|
|
607
|
-
/**
|
|
608
|
-
* Counts the number of words in a given string.
|
|
609
|
-
* @param text - The input string to count words from.
|
|
610
|
-
* @returns The number of words in the string.
|
|
611
|
-
*/
|
|
612
|
-
declare const countWords: (text: string) => number;
|
|
613
|
-
/**
|
|
614
|
-
* Checks if a given string is a valid URL.
|
|
615
|
-
* @param urlString - The string to check.
|
|
616
|
-
* @returns True if the string is a valid URL, false otherwise.
|
|
617
|
-
*/
|
|
618
|
-
declare const isValidUrl: (urlString: string) => boolean;
|
|
619
609
|
/**
|
|
620
610
|
* Checks if all content links in the given text are verified.
|
|
621
611
|
* @param content - The content to check for links.
|
|
@@ -671,6 +661,18 @@ declare const validateWiki: (wiki: Wiki) => {
|
|
|
671
661
|
error?: undefined;
|
|
672
662
|
};
|
|
673
663
|
|
|
664
|
+
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
665
|
+
interface IDiscordLogger {
|
|
666
|
+
log(data: DiscordLogData): Promise<void>;
|
|
667
|
+
}
|
|
668
|
+
type DiscordLogData = {
|
|
669
|
+
message: string;
|
|
670
|
+
title?: string;
|
|
671
|
+
color?: number;
|
|
672
|
+
};
|
|
673
|
+
declare const oauth: OAuth;
|
|
674
|
+
declare function sendTwitterApiRequest(url: string, method: HttpMethod, logger?: IDiscordLogger, body?: string): Promise<Response>;
|
|
675
|
+
|
|
674
676
|
declare const WIKI_SUMMARY_MAX_LENGTH = 255;
|
|
675
677
|
declare const WIKI_CONTENT_MIN_WORDS = 100;
|
|
676
678
|
declare const WIKI_TITLE_MAX_LENGTH = 60;
|
|
@@ -698,4 +700,47 @@ declare const IDEAL_SOCIAL_MEDIA_COUNT = 4;
|
|
|
698
700
|
declare const WHITELISTED_DOMAINS: string[];
|
|
699
701
|
declare const WHITELISTED_LINK_NAMES: string[];
|
|
700
702
|
|
|
701
|
-
|
|
703
|
+
/**
|
|
704
|
+
* Counts the number of words in a given string.
|
|
705
|
+
* @param text - The input string to count words from.
|
|
706
|
+
* @returns The number of words in the string.
|
|
707
|
+
*/
|
|
708
|
+
declare function countWords(text: string): number;
|
|
709
|
+
/**
|
|
710
|
+
* Checks if a given string is a valid URL.
|
|
711
|
+
* @param urlString - The string to check.
|
|
712
|
+
* @returns True if the string is a valid URL, false otherwise.
|
|
713
|
+
*/
|
|
714
|
+
declare const isValidUrl: (urlString: string) => boolean;
|
|
715
|
+
declare function containsOnlyVerifiedLinks(content: string): boolean;
|
|
716
|
+
declare function isMediaContentValid(media: Media[]): boolean;
|
|
717
|
+
declare function isMediaCountWithinLimits(media: Media[]): boolean;
|
|
718
|
+
declare function isMediaContentAndCountValid(media: Media[]): boolean;
|
|
719
|
+
declare function isEventWikiValid(wiki: {
|
|
720
|
+
tags: {
|
|
721
|
+
id: string;
|
|
722
|
+
}[];
|
|
723
|
+
metadata: {
|
|
724
|
+
id: string;
|
|
725
|
+
value: string;
|
|
726
|
+
}[];
|
|
727
|
+
events: unknown[];
|
|
728
|
+
}): boolean;
|
|
729
|
+
declare function hasMinimumWordCount(content: string): boolean;
|
|
730
|
+
declare function hasAtLeastOneReference(metadata: MetaData[]): boolean;
|
|
731
|
+
declare function transformAndFilterMetadata(metadata: MetaData[]): Promise<MetaData[]>;
|
|
732
|
+
declare function transformAndFilterTags(tags: {
|
|
733
|
+
id: string;
|
|
734
|
+
}[]): {
|
|
735
|
+
id: Tag;
|
|
736
|
+
}[];
|
|
737
|
+
declare const api: axios.AxiosInstance;
|
|
738
|
+
declare function getExplorers(): Promise<Explorer[]>;
|
|
739
|
+
interface Explorer {
|
|
740
|
+
id: string;
|
|
741
|
+
baseUrl: string;
|
|
742
|
+
explorer: string;
|
|
743
|
+
hidden: boolean;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
export { BaseCategory, BaseEvents, CITATIONS_SCORE_WEIGHT, CONTENT_SCORE_WEIGHT, Category, CommonMetaIds, CreateNewWikiSlug, EditSpecificMetaIds, EditorContentOverride, EventType, 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, IPFS_HASH_LENGTH, Image, LanguagesISO, LinkedWikiKey, MAX_MEDIA_COUNT, MEDIA_SCORE_WEIGHT, MEDIA_UPLOAD_PENDING_SUFFIX, MIN_CONTENT_WORD_COUNT, Media, MediaSource, MediaType, MetaData, ProfileData, ProfileLinks, Reference, SOCIAL_SCORE_WEIGHT, SUMMARY_SCORE_WEIGHT, TAGS_SCORE_WEIGHT, Tag, ValidatorCodes, WHITELISTED_DOMAINS, WHITELISTED_LINK_NAMES, WIKI_CONTENT_MIN_WORDS, WIKI_SUMMARY_MAX_LENGTH, WIKI_TITLE_MAX_LENGTH, Wiki, api, areContentLinksVerified, calculateWikiScore, containsOnlyVerifiedLinks, countWords, getExplorers, hasAtLeastOneReference, hasMinimumWordCount, hasNoCitations, isAnyMediaUploading, isEventDateMissing, isEventUrlMissing, isEventWikiValid, isMediaContentAndCountValid, isMediaContentValid, isMediaCountWithinLimits, isMediaValid, isSummaryTooLong, isValidUrl, oauth, sendTwitterApiRequest, transformAndFilterMetadata, transformAndFilterTags, validateWiki };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
+
import OAuth from 'oauth-1.0a';
|
|
3
|
+
import * as axios from 'axios';
|
|
2
4
|
|
|
3
5
|
/**
|
|
4
6
|
* ========================
|
|
@@ -221,7 +223,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
221
223
|
}, {
|
|
222
224
|
id: string;
|
|
223
225
|
}>, "many">, {
|
|
224
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
226
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
225
227
|
}[], {
|
|
226
228
|
id: string;
|
|
227
229
|
}[]>;
|
|
@@ -376,7 +378,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
376
378
|
title: string;
|
|
377
379
|
}[];
|
|
378
380
|
tags: {
|
|
379
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
381
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
380
382
|
}[];
|
|
381
383
|
metadata: {
|
|
382
384
|
id: string;
|
|
@@ -486,7 +488,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
|
|
|
486
488
|
title: string;
|
|
487
489
|
}[];
|
|
488
490
|
tags: {
|
|
489
|
-
id: "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "
|
|
491
|
+
id: "Events" | "Artists" | "AI" | "BinanceSmartChain" | "Blockchains" | "CEXes" | "Collections" | "Collectors" | "Conference" | "DEXes" | "Developers" | "Entertainment" | "Ethereum" | "Forum" | "Founders" | "Festival" | "Games" | "Glossary" | "Hackathon" | "Marketplaces" | "Memecoins" | "Organizations" | "Online" | "PeopleInDeFi" | "Polkadot" | "Polygon" | "Protocols" | "Solana" | "Speakers" | "Stablecoins" | "Venture";
|
|
490
492
|
}[];
|
|
491
493
|
metadata: {
|
|
492
494
|
id: string;
|
|
@@ -604,18 +606,6 @@ type Reference = z.infer<typeof Reference>;
|
|
|
604
606
|
|
|
605
607
|
declare const calculateWikiScore: (wiki: Wiki) => number;
|
|
606
608
|
|
|
607
|
-
/**
|
|
608
|
-
* Counts the number of words in a given string.
|
|
609
|
-
* @param text - The input string to count words from.
|
|
610
|
-
* @returns The number of words in the string.
|
|
611
|
-
*/
|
|
612
|
-
declare const countWords: (text: string) => number;
|
|
613
|
-
/**
|
|
614
|
-
* Checks if a given string is a valid URL.
|
|
615
|
-
* @param urlString - The string to check.
|
|
616
|
-
* @returns True if the string is a valid URL, false otherwise.
|
|
617
|
-
*/
|
|
618
|
-
declare const isValidUrl: (urlString: string) => boolean;
|
|
619
609
|
/**
|
|
620
610
|
* Checks if all content links in the given text are verified.
|
|
621
611
|
* @param content - The content to check for links.
|
|
@@ -671,6 +661,18 @@ declare const validateWiki: (wiki: Wiki) => {
|
|
|
671
661
|
error?: undefined;
|
|
672
662
|
};
|
|
673
663
|
|
|
664
|
+
type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
665
|
+
interface IDiscordLogger {
|
|
666
|
+
log(data: DiscordLogData): Promise<void>;
|
|
667
|
+
}
|
|
668
|
+
type DiscordLogData = {
|
|
669
|
+
message: string;
|
|
670
|
+
title?: string;
|
|
671
|
+
color?: number;
|
|
672
|
+
};
|
|
673
|
+
declare const oauth: OAuth;
|
|
674
|
+
declare function sendTwitterApiRequest(url: string, method: HttpMethod, logger?: IDiscordLogger, body?: string): Promise<Response>;
|
|
675
|
+
|
|
674
676
|
declare const WIKI_SUMMARY_MAX_LENGTH = 255;
|
|
675
677
|
declare const WIKI_CONTENT_MIN_WORDS = 100;
|
|
676
678
|
declare const WIKI_TITLE_MAX_LENGTH = 60;
|
|
@@ -698,4 +700,47 @@ declare const IDEAL_SOCIAL_MEDIA_COUNT = 4;
|
|
|
698
700
|
declare const WHITELISTED_DOMAINS: string[];
|
|
699
701
|
declare const WHITELISTED_LINK_NAMES: string[];
|
|
700
702
|
|
|
701
|
-
|
|
703
|
+
/**
|
|
704
|
+
* Counts the number of words in a given string.
|
|
705
|
+
* @param text - The input string to count words from.
|
|
706
|
+
* @returns The number of words in the string.
|
|
707
|
+
*/
|
|
708
|
+
declare function countWords(text: string): number;
|
|
709
|
+
/**
|
|
710
|
+
* Checks if a given string is a valid URL.
|
|
711
|
+
* @param urlString - The string to check.
|
|
712
|
+
* @returns True if the string is a valid URL, false otherwise.
|
|
713
|
+
*/
|
|
714
|
+
declare const isValidUrl: (urlString: string) => boolean;
|
|
715
|
+
declare function containsOnlyVerifiedLinks(content: string): boolean;
|
|
716
|
+
declare function isMediaContentValid(media: Media[]): boolean;
|
|
717
|
+
declare function isMediaCountWithinLimits(media: Media[]): boolean;
|
|
718
|
+
declare function isMediaContentAndCountValid(media: Media[]): boolean;
|
|
719
|
+
declare function isEventWikiValid(wiki: {
|
|
720
|
+
tags: {
|
|
721
|
+
id: string;
|
|
722
|
+
}[];
|
|
723
|
+
metadata: {
|
|
724
|
+
id: string;
|
|
725
|
+
value: string;
|
|
726
|
+
}[];
|
|
727
|
+
events: unknown[];
|
|
728
|
+
}): boolean;
|
|
729
|
+
declare function hasMinimumWordCount(content: string): boolean;
|
|
730
|
+
declare function hasAtLeastOneReference(metadata: MetaData[]): boolean;
|
|
731
|
+
declare function transformAndFilterMetadata(metadata: MetaData[]): Promise<MetaData[]>;
|
|
732
|
+
declare function transformAndFilterTags(tags: {
|
|
733
|
+
id: string;
|
|
734
|
+
}[]): {
|
|
735
|
+
id: Tag;
|
|
736
|
+
}[];
|
|
737
|
+
declare const api: axios.AxiosInstance;
|
|
738
|
+
declare function getExplorers(): Promise<Explorer[]>;
|
|
739
|
+
interface Explorer {
|
|
740
|
+
id: string;
|
|
741
|
+
baseUrl: string;
|
|
742
|
+
explorer: string;
|
|
743
|
+
hidden: boolean;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
export { BaseCategory, BaseEvents, CITATIONS_SCORE_WEIGHT, CONTENT_SCORE_WEIGHT, Category, CommonMetaIds, CreateNewWikiSlug, EditSpecificMetaIds, EditorContentOverride, EventType, 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, IPFS_HASH_LENGTH, Image, LanguagesISO, LinkedWikiKey, MAX_MEDIA_COUNT, MEDIA_SCORE_WEIGHT, MEDIA_UPLOAD_PENDING_SUFFIX, MIN_CONTENT_WORD_COUNT, Media, MediaSource, MediaType, MetaData, ProfileData, ProfileLinks, Reference, SOCIAL_SCORE_WEIGHT, SUMMARY_SCORE_WEIGHT, TAGS_SCORE_WEIGHT, Tag, ValidatorCodes, WHITELISTED_DOMAINS, WHITELISTED_LINK_NAMES, WIKI_CONTENT_MIN_WORDS, WIKI_SUMMARY_MAX_LENGTH, WIKI_TITLE_MAX_LENGTH, Wiki, api, areContentLinksVerified, calculateWikiScore, containsOnlyVerifiedLinks, countWords, getExplorers, hasAtLeastOneReference, hasMinimumWordCount, hasNoCitations, isAnyMediaUploading, isEventDateMissing, isEventUrlMissing, isEventWikiValid, isMediaContentAndCountValid, isMediaContentValid, isMediaCountWithinLimits, isMediaValid, isSummaryTooLong, isValidUrl, oauth, sendTwitterApiRequest, transformAndFilterMetadata, transformAndFilterTags, validateWiki };
|
package/dist/index.js
CHANGED
|
@@ -3,11 +3,15 @@
|
|
|
3
3
|
var zod = require('zod');
|
|
4
4
|
var axios = require('axios');
|
|
5
5
|
var QuickLRU = require('quick-lru');
|
|
6
|
+
var crypto = require('crypto');
|
|
7
|
+
var OAuth = require('oauth-1.0a');
|
|
6
8
|
|
|
7
9
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
10
|
|
|
9
11
|
var axios__default = /*#__PURE__*/_interopDefault(axios);
|
|
10
12
|
var QuickLRU__default = /*#__PURE__*/_interopDefault(QuickLRU);
|
|
13
|
+
var crypto__default = /*#__PURE__*/_interopDefault(crypto);
|
|
14
|
+
var OAuth__default = /*#__PURE__*/_interopDefault(OAuth);
|
|
11
15
|
|
|
12
16
|
// src/data/constants.ts
|
|
13
17
|
var WIKI_SUMMARY_MAX_LENGTH = 255;
|
|
@@ -47,13 +51,13 @@ var WHITELISTED_LINK_NAMES = ["YOUTUBE@VID", "DUNE@EMBED"];
|
|
|
47
51
|
function countWords(text) {
|
|
48
52
|
return text.split(" ").filter((word) => word !== "").length;
|
|
49
53
|
}
|
|
50
|
-
|
|
54
|
+
var isValidUrl = (urlString) => {
|
|
51
55
|
try {
|
|
52
56
|
return Boolean(new URL(urlString));
|
|
53
57
|
} catch (_e) {
|
|
54
58
|
return false;
|
|
55
59
|
}
|
|
56
|
-
}
|
|
60
|
+
};
|
|
57
61
|
function containsOnlyVerifiedLinks(content) {
|
|
58
62
|
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
59
63
|
return markdownLinks?.every((link) => {
|
|
@@ -96,9 +100,7 @@ function isMediaContentAndCountValid(media) {
|
|
|
96
100
|
}
|
|
97
101
|
function isEventWikiValid(wiki) {
|
|
98
102
|
if (wiki.tags.some((tag) => tag.id === "Events")) {
|
|
99
|
-
const referencesData = wiki.metadata.find(
|
|
100
|
-
(meta) => meta.id === CommonMetaIds.Enum.references
|
|
101
|
-
)?.value || "[]";
|
|
103
|
+
const referencesData = wiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value || "[]";
|
|
102
104
|
const references = JSON.parse(
|
|
103
105
|
referencesData
|
|
104
106
|
);
|
|
@@ -312,7 +314,7 @@ var BaseEvents = zod.z.object({
|
|
|
312
314
|
country: zod.z.string().nullish(),
|
|
313
315
|
action: zod.z.enum(["DELETE", "EDIT", "CREATE"]).nullish()
|
|
314
316
|
});
|
|
315
|
-
var
|
|
317
|
+
var Wiki2 = zod.z.object({
|
|
316
318
|
id: zod.z.string(),
|
|
317
319
|
title: zod.z.string().min(1, "Add a Title at the top for this Wiki to continue").max(
|
|
318
320
|
WIKI_TITLE_MAX_LENGTH,
|
|
@@ -352,10 +354,15 @@ var Wiki = zod.z.object({
|
|
|
352
354
|
[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],
|
|
353
355
|
[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? []
|
|
354
356
|
}))
|
|
355
|
-
}).refine(
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
357
|
+
}).refine(
|
|
358
|
+
(arg) => isEventWikiValid(
|
|
359
|
+
arg
|
|
360
|
+
),
|
|
361
|
+
{
|
|
362
|
+
message: "Event wikis must have an event link citation and at least one event date",
|
|
363
|
+
path: ["events"]
|
|
364
|
+
}
|
|
365
|
+
);
|
|
359
366
|
var Reference = zod.z.object({
|
|
360
367
|
id: zod.z.string(),
|
|
361
368
|
description: zod.z.string(),
|
|
@@ -471,19 +478,11 @@ var calculateWikiScore = (wiki) => {
|
|
|
471
478
|
};
|
|
472
479
|
|
|
473
480
|
// src/lib/check-wiki-validity.ts
|
|
474
|
-
var countWords2 = (text) => text.split(" ").filter((word) => word !== "").length;
|
|
475
|
-
var isValidUrl2 = (urlString) => {
|
|
476
|
-
try {
|
|
477
|
-
return Boolean(new URL(urlString));
|
|
478
|
-
} catch (_e) {
|
|
479
|
-
return false;
|
|
480
|
-
}
|
|
481
|
-
};
|
|
482
481
|
var areContentLinksVerified = (content) => {
|
|
483
482
|
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
484
483
|
return markdownLinks?.every((link) => {
|
|
485
484
|
const [, linkText, linkUrl] = RegExp(/\[(.*?)\]\((.*?)\)/).exec(link) || [];
|
|
486
|
-
if (linkText && linkUrl && WHITELISTED_LINK_NAMES.includes(linkText) && !
|
|
485
|
+
if (linkText && linkUrl && WHITELISTED_LINK_NAMES.includes(linkText) && !isValidUrl(linkUrl)) {
|
|
487
486
|
return true;
|
|
488
487
|
}
|
|
489
488
|
if (linkUrl && !linkUrl.startsWith("#")) {
|
|
@@ -535,7 +534,7 @@ var hasNoCitations = (wiki) => {
|
|
|
535
534
|
return !references?.value || references.value.length === 0;
|
|
536
535
|
};
|
|
537
536
|
var validateWiki = (wiki) => {
|
|
538
|
-
const wordCount =
|
|
537
|
+
const wordCount = countWords(wiki.content || "");
|
|
539
538
|
if (!wiki.title) {
|
|
540
539
|
return {
|
|
541
540
|
isValid: false,
|
|
@@ -604,6 +603,53 @@ var validateWiki = (wiki) => {
|
|
|
604
603
|
}
|
|
605
604
|
return { isValid: true };
|
|
606
605
|
};
|
|
606
|
+
var oauth = new OAuth__default.default({
|
|
607
|
+
consumer: {
|
|
608
|
+
key: process.env.TWITTER_CONSUMER_KEY ?? "",
|
|
609
|
+
secret: process.env.TWITTER_CONSUMER_SECRET ?? ""
|
|
610
|
+
},
|
|
611
|
+
signature_method: "HMAC-SHA1",
|
|
612
|
+
hash_function: (base_string, key) => {
|
|
613
|
+
return crypto__default.default.createHmac("sha1", key).update(base_string).digest("base64");
|
|
614
|
+
}
|
|
615
|
+
});
|
|
616
|
+
var twitterAuthConfig = {
|
|
617
|
+
key: process.env.TWITTER_ACCESS_TOKEN ?? "",
|
|
618
|
+
secret: process.env.TWITTER_ACCESS_TOKEN_SECRET ?? ""
|
|
619
|
+
};
|
|
620
|
+
async function sendTwitterApiRequest(url, method, logger, body) {
|
|
621
|
+
if (!url.startsWith("https://api.twitter.com/")) {
|
|
622
|
+
throw new Error("Invalid Twitter API URL");
|
|
623
|
+
}
|
|
624
|
+
const oauth_headers = oauth.toHeader(
|
|
625
|
+
oauth.authorize(
|
|
626
|
+
{
|
|
627
|
+
url,
|
|
628
|
+
method
|
|
629
|
+
},
|
|
630
|
+
twitterAuthConfig
|
|
631
|
+
)
|
|
632
|
+
);
|
|
633
|
+
const response = await fetch(url, {
|
|
634
|
+
method,
|
|
635
|
+
headers: {
|
|
636
|
+
...oauth_headers,
|
|
637
|
+
"Content-Type": "application/json"
|
|
638
|
+
},
|
|
639
|
+
body
|
|
640
|
+
});
|
|
641
|
+
if (!response.ok) {
|
|
642
|
+
const errorBody = await response.text();
|
|
643
|
+
logger?.log({
|
|
644
|
+
message: `\u{1F6A8} HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,
|
|
645
|
+
title: "Twitter Authentication: makeAuthenticatedRequest"
|
|
646
|
+
});
|
|
647
|
+
throw new Error(
|
|
648
|
+
`HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`
|
|
649
|
+
);
|
|
650
|
+
}
|
|
651
|
+
return response;
|
|
652
|
+
}
|
|
607
653
|
|
|
608
654
|
exports.BaseCategory = BaseCategory;
|
|
609
655
|
exports.BaseEvents = BaseEvents;
|
|
@@ -648,17 +694,30 @@ exports.WHITELISTED_LINK_NAMES = WHITELISTED_LINK_NAMES;
|
|
|
648
694
|
exports.WIKI_CONTENT_MIN_WORDS = WIKI_CONTENT_MIN_WORDS;
|
|
649
695
|
exports.WIKI_SUMMARY_MAX_LENGTH = WIKI_SUMMARY_MAX_LENGTH;
|
|
650
696
|
exports.WIKI_TITLE_MAX_LENGTH = WIKI_TITLE_MAX_LENGTH;
|
|
651
|
-
exports.Wiki =
|
|
697
|
+
exports.Wiki = Wiki2;
|
|
698
|
+
exports.api = api;
|
|
652
699
|
exports.areContentLinksVerified = areContentLinksVerified;
|
|
653
700
|
exports.calculateWikiScore = calculateWikiScore;
|
|
654
|
-
exports.
|
|
701
|
+
exports.containsOnlyVerifiedLinks = containsOnlyVerifiedLinks;
|
|
702
|
+
exports.countWords = countWords;
|
|
703
|
+
exports.getExplorers = getExplorers;
|
|
704
|
+
exports.hasAtLeastOneReference = hasAtLeastOneReference;
|
|
705
|
+
exports.hasMinimumWordCount = hasMinimumWordCount;
|
|
655
706
|
exports.hasNoCitations = hasNoCitations;
|
|
656
707
|
exports.isAnyMediaUploading = isAnyMediaUploading;
|
|
657
708
|
exports.isEventDateMissing = isEventDateMissing;
|
|
658
709
|
exports.isEventUrlMissing = isEventUrlMissing;
|
|
710
|
+
exports.isEventWikiValid = isEventWikiValid;
|
|
711
|
+
exports.isMediaContentAndCountValid = isMediaContentAndCountValid;
|
|
712
|
+
exports.isMediaContentValid = isMediaContentValid;
|
|
713
|
+
exports.isMediaCountWithinLimits = isMediaCountWithinLimits;
|
|
659
714
|
exports.isMediaValid = isMediaValid;
|
|
660
715
|
exports.isSummaryTooLong = isSummaryTooLong;
|
|
661
|
-
exports.isValidUrl =
|
|
716
|
+
exports.isValidUrl = isValidUrl;
|
|
717
|
+
exports.oauth = oauth;
|
|
718
|
+
exports.sendTwitterApiRequest = sendTwitterApiRequest;
|
|
719
|
+
exports.transformAndFilterMetadata = transformAndFilterMetadata;
|
|
720
|
+
exports.transformAndFilterTags = transformAndFilterTags;
|
|
662
721
|
exports.validateWiki = validateWiki;
|
|
663
722
|
//# sourceMappingURL=index.js.map
|
|
664
723
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/constants.ts","../src/lib/wiki-helpers.ts","../src/schema/index.ts","../src/lib/wiki-score.ts","../src/lib/check-wiki-validity.ts"],"names":["QuickLRU","axios","z","countWords","isValidUrl","isMediaContentValid"],"mappings":"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","file":"index.js","sourcesContent":["export const WIKI_SUMMARY_MAX_LENGTH = 255;\nexport const WIKI_CONTENT_MIN_WORDS = 100;\nexport const WIKI_TITLE_MAX_LENGTH = 60;\nexport const MEDIA_UPLOAD_PENDING_SUFFIX = \"default\";\nexport const MAX_MEDIA_COUNT = 25;\nexport const IPFS_HASH_LENGTH = 46;\nexport const EditorContentOverride = \"%OVERRIDE@EDITOR@MARKDOWN%\";\nexport const CreateNewWikiSlug = \"/*CREATE+NEW+WIKI*/\";\n\nexport const MIN_CONTENT_WORD_COUNT = 10;\nexport const GOOD_CONTENT_WORD_COUNT = 500;\nexport const IDEAL_CONTENT_WORD_COUNT = 1500;\n\nexport const CONTENT_SCORE_WEIGHT = 0.8;\nexport const INTERNAL_LINKS_SCORE_WEIGHT = 0.5;\nexport const CITATIONS_SCORE_WEIGHT = 0.5;\nexport const MEDIA_SCORE_WEIGHT = 0.3;\nexport const TAGS_SCORE_WEIGHT = 0.3;\nexport const SUMMARY_SCORE_WEIGHT = 0.5;\nexport const SOCIAL_SCORE_WEIGHT = 0.5;\n\nexport const IDEAL_INTERNAL_LINKS_COUNT = 10;\nexport const IDEAL_CITATIONS_COUNT = 10;\nexport const IDEAL_MEDIA_COUNT = 5;\nexport const IDEAL_TAGS_COUNT = 3;\nexport const IDEAL_SUMMARY_LENGTH = 100;\nexport const IDEAL_SOCIAL_MEDIA_COUNT = 4;\n\nexport const WHITELISTED_DOMAINS = [\n\t\"youtube.com/watch\",\n\t\"youtu.be\",\n\t\"vimeo.com\",\n\t\"alpha.everipedia.org/wiki\",\n\t\"beta.everipedia.org/wiki\",\n\t\"iq.wiki/wiki\",\n\t\"ipfs.everipedia.org/ipfs\",\n];\n\nexport const WHITELISTED_LINK_NAMES = [\"YOUTUBE@VID\", \"DUNE@EMBED\"];\n","import axios from \"axios\";\nimport QuickLRU from \"quick-lru\";\nimport {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n\tWIKI_CONTENT_MIN_WORDS,\n} from \"../data/constants\";\nimport {\n\tCommonMetaIds,\n\tEditSpecificMetaIds,\n\ttype Media,\n\tMediaSource,\n\tMediaType,\n\ttype MetaData,\n\tTag,\n} from \"../schema\";\n\n// ===============================\n// Text and content helpers\n// ===============================\n\nexport function countWords(text: string): number {\n\treturn text.split(\" \").filter((word) => word !== \"\").length;\n}\n\nexport function isValidUrl(urlString: string): boolean {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n}\n\nexport function containsOnlyVerifiedLinks(content: string): boolean {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n}\n\n// ===============================\n// Media validation helpers\n// ===============================\nexport function isMediaContentValid(media: Media[]): boolean {\n\treturn media.every((item) => {\n\t\tif (\n\t\t\titem.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\titem.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn item.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*)(?:\\?si=[^#&?]*)?(?:\\?v=[^#&?]*)?(?:[#&].*)?$/;\n\t\t\treturn (\n\t\t\t\titem.id === `https://www.youtube.com/watch?v=${item.name}` &&\n\t\t\t\tyoutubePattern.test(item.id)\n\t\t\t);\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn item.id === `https://vimeo.com/${item.name}`;\n\t\t}\n\n\t\treturn item.type ? item.type in MediaType : true;\n\t});\n}\n\nexport function isMediaCountWithinLimits(media: Media[]): boolean {\n\tconst iconMediaCount = media.filter(\n\t\t(item) => item.type === MediaType.Enum.ICON,\n\t).length;\n\treturn media.length <= MAX_MEDIA_COUNT && iconMediaCount <= 1;\n}\n\nexport function isMediaContentAndCountValid(media: Media[]): boolean {\n\treturn isMediaContentValid(media) && isMediaCountWithinLimits(media);\n}\n\n// ===============================\n// Wiki-specific validation helpers\n// ===============================\nexport function isEventWikiValid(wiki: any): boolean {\n\tif (wiki.tags.some((tag: any) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find(\n\t\t\t\t(meta: any) => meta.id === CommonMetaIds.Enum.references,\n\t\t\t)?.value || \"[]\";\n\t\tconst references: { description: string }[] = JSON.parse(\n\t\t\treferencesData,\n\t\t) as { description: string }[];\n\t\tconst hasEventLink = references.some(\n\t\t\t(item) => item.description.toLowerCase() === \"event link\",\n\t\t);\n\t\treturn hasEventLink && Array.isArray(wiki.events) && wiki.events.length > 0;\n\t}\n\treturn true;\n}\n\nexport function hasMinimumWordCount(content: string): boolean {\n\treturn countWords(content) >= WIKI_CONTENT_MIN_WORDS;\n}\n\n// ===============================\n// Metadata helpers\n// ===============================\nexport function hasAtLeastOneReference(metadata: MetaData[]): boolean {\n\tconst referencesData =\n\t\tmetadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value ||\n\t\t\"[]\";\n\tconst references = JSON.parse(referencesData) as { description: string }[];\n\treturn references.length > 0;\n}\n\nexport async function transformAndFilterMetadata(\n\tmetadata: MetaData[],\n): Promise<MetaData[]> {\n\tconst explorers = await getExplorers();\n\tconst validIds = new Set([\n\t\t...CommonMetaIds.options,\n\t\t...EditSpecificMetaIds.options,\n\t\t...explorers.map((e) => e.id),\n\t]);\n\n\treturn metadata.filter((meta) => {\n\t\tif (!validIds.has(meta.id)) return false;\n\n\t\tconst explorer = explorers.find((e) => e.id === meta.id);\n\t\tif (explorer) {\n\t\t\treturn (\n\t\t\t\tisValidUrl(meta.value) &&\n\t\t\t\tnew URL(meta.value).origin === new URL(explorer.baseUrl).origin\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n// ===============================\n// Tag helpers\n// ===============================\nexport function transformAndFilterTags(tags: { id: string }[]): { id: Tag }[] {\n\treturn tags\n\t\t.filter((tag) => Tag.safeParse(tag.id).success)\n\t\t.map((tag) => ({ id: tag.id as Tag }));\n}\n\n// ===============================\n// API-related helpers\n// ===============================\n\nconst cache = new QuickLRU({\n\tmaxSize: 1000,\n\tmaxAge: 12 * 60 * 60 * 1000, // 12 hours\n});\n\nexport const api = axios.create({\n\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\theaders: {\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\nexport async function getExplorers(): Promise<Explorer[]> {\n\tconst cacheKey = \"explorers\";\n\tconst cachedData = cache.get(cacheKey) as Explorer[];\n\n\tif (cachedData) {\n\t\treturn cachedData;\n\t}\n\n\tconst query = `\n query ExplorersList($offset: Int!, $limit: Int!) {\n explorers(offset: $offset, limit: $limit) {\n id\n baseUrl\n explorer\n hidden\n }\n }\n `;\n\n\tconst { data } = await api.post<{ data: { explorers: Explorer[] } }>(\"\", {\n\t\tquery,\n\t\tvariables: {\n\t\t\toffset: 0,\n\t\t\tlimit: 30,\n\t\t},\n\t});\n\n\tconst explorers = data.data.explorers;\n\tcache.set(cacheKey, explorers);\n\n\treturn explorers;\n}\n\n// ===============================\n// Types\n// ===============================\n\ninterface Explorer {\n\tid: string;\n\tbaseUrl: string;\n\texplorer: string;\n\thidden: boolean;\n}\n","import { z } from \"zod\";\n\nimport {\n\tMAX_MEDIA_COUNT,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n} from \"../data/constants\";\nimport {\n\ttransformAndFilterMetadata,\n\tcontainsOnlyVerifiedLinks,\n\thasAtLeastOneReference,\n\thasMinimumWordCount,\n\tisEventWikiValid,\n\tisMediaContentAndCountValid,\n\ttransformAndFilterTags,\n} from \"../lib/wiki-helpers\";\n\n/**\n * ========================\n * ===== Enum Schemas =====\n * ========================\n */\nexport const MediaType = z.enum([\"GALLERY\", \"ICON\"]);\nexport type MediaType = z.infer<typeof MediaType>;\n\nexport const MediaSource = z.enum([\"IPFS_IMG\", \"VIMEO\", \"YOUTUBE\", \"IPFS_VID\"]);\nexport type MediaSource = z.infer<typeof MediaSource>;\n\nexport const CommonMetaIds = z.enum([\n\t\"references\",\n\t\"website\",\n\t\"contract_url\",\n\t\"location\",\n\t\"email_url\",\n\t\"facebook_profile\",\n\t\"instagram_profile\",\n\t\"twitter_profile\",\n\t\"linkedin_profile\",\n\t\"youtube_profile\",\n\t\"discord_profile\",\n\t\"reddit_profile\",\n\t\"telegram_profile\",\n\t\"github_profile\",\n\t\"coinmarketcap_url\",\n\t\"coingecko_profile\",\n\t\"opensea_profile\",\n\t\"medium_profile\",\n\t\"mirror_profile\",\n\t\"tiktok_profile\",\n\t\"explorer_injective_profile\",\n]);\nexport type CommonMetaIds = z.infer<typeof CommonMetaIds>;\n\nexport const EditSpecificMetaIds = z.enum([\"previous_cid\", \"commit-message\"]);\nexport type EditSpecificMetaIds = z.infer<typeof EditSpecificMetaIds>;\n\nexport const ValidatorCodes = z.enum([\n\t\"VALID_WIKI\",\n\t\"ID_ERROR\",\n\t\"LANGUAGE_ERROR\",\n\t\"USER_ERROR\",\n\t\"WORD_COUNT_ERROR\",\n\t\"CATEGORY_ERROR\",\n\t\"SUMMARY_ERROR\",\n\t\"IMAGE_ERROR\",\n\t\"TAG_ERROR\",\n\t\"EXTERNAL_URL_ERROR\",\n\t\"METADATA_ERROR\",\n\t\"MEDIA_ERROR\",\n\t\"GLOBAL_RATE_LIMIT\",\n\t\"LINKED_WIKIS\",\n\t\"EVENTS_ERROR\",\n]);\nexport type ValidatorCodes = z.infer<typeof ValidatorCodes>;\n\nexport const LanguagesISO = z.enum([\"en\", \"es\", \"zh\", \"ko\"]);\nexport type LanguagesISO = z.infer<typeof LanguagesISO>;\n\nexport const LinkedWikiKey = z.enum([\"founders\", \"blockchains\", \"speakers\"]);\nexport type LinkedWikiKey = z.infer<typeof LinkedWikiKey>;\n\nexport const EventType = z.enum([\"CREATED\", \"DEFAULT\", \"MULTIDATE\"]);\nexport type EventType = z.infer<typeof EventType>;\n\nexport const Tag = z.enum([\n\t\"Artists\",\n\t\"AI\",\n\t\"BinanceSmartChain\",\n\t\"Blockchains\",\n\t\"CEXes\",\n\t\"Collections\",\n\t\"Collectors\",\n\t\"Conference\",\n\t\"DEXes\",\n\t\"Developers\",\n\t\"Entertainment\",\n\t\"Ethereum\",\n\t\"Events\",\n\t\"Forum\",\n\t\"Founders\",\n\t\"Festival\",\n\t\"Games\",\n\t\"Glossary\",\n\t\"Hackathon\",\n\t\"Marketplaces\",\n\t\"Memecoins\",\n\t\"Organizations\",\n\t\"Online\",\n\t\"PeopleInDeFi\",\n\t\"Polkadot\",\n\t\"Polygon\",\n\t\"Protocols\",\n\t\"Solana\",\n\t\"Speakers\",\n\t\"Stablecoins\",\n\t\"Venture\",\n]);\nexport type Tag = z.infer<typeof Tag>;\n\nexport const Category = z.enum([\n\t\"nfts\",\n\t\"defi\",\n\t\"exchanges\",\n\t\"cryptocurrencies\",\n\t\"daos\",\n\t\"people\",\n\t\"dapps\",\n\t\"organizations\",\n]);\nexport type Category = z.infer<typeof Category>;\n\n/**\n * ==============================\n * ===== Supporting Schemas =====\n * ==============================\n */\n\nexport const ProfileLinks = z.object({\n\ttwitter: z.string().nullable(),\n\twebsite: z.string().nullable(),\n\tinstagram: z.string().nullable(),\n});\nexport type ProfileLinks = z.infer<typeof ProfileLinks>;\n\nexport const ProfileData = z.object({\n\tid: z.string().nullable(),\n\tusername: z.string().nullable(),\n\tbio: z.string().nullable(),\n\tlinks: z.array(ProfileLinks).nullable(),\n\tbanner: z.string().nullable(),\n\tavatar: z.string().nullable(),\n});\nexport type ProfileData = z.infer<typeof ProfileData>;\n\nexport const Image = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n});\nexport type Image = z.infer<typeof Image>;\n\nexport const Media = z.object({\n\tid: z.string(),\n\tsize: z.union([z.string(), z.number()]).nullish(),\n\tname: z.string().nullish(),\n\ttype: MediaType.nullish(),\n\tcaption: z.string().nullish(),\n\tthumbnail: z.string().nullish(),\n\tsource: MediaSource,\n});\nexport type Media = z.infer<typeof Media>;\n\nconst MetaData = z.object({\n\tid: z.string(),\n\tvalue: z.any(),\n});\nexport type MetaData = z.infer<typeof MetaData>;\n\nexport const BaseCategory = z.object({\n\tid: Category,\n\ttitle: z.string(),\n});\nexport type BaseCategory = z.infer<typeof BaseCategory>;\n\nexport const BaseEvents = z.object({\n\tid: z.string().nullish(),\n\tdate: z.string().nullable(),\n\ttitle: z.string().nullish(),\n\ttype: EventType.nullable(),\n\tdescription: z.string().nullish(),\n\tlink: z.string().nullish(),\n\tmultiDateStart: z.string().nullish(),\n\tmultiDateEnd: z.string().nullish(),\n\tcontinent: z.string().nullish(),\n\tcountry: z.string().nullish(),\n\taction: z.enum([\"DELETE\", \"EDIT\", \"CREATE\"]).nullish(),\n});\nexport type BaseEvents = z.infer<typeof BaseEvents>;\n\n/**\n * ========================\n * ===== Core Schemas =====\n * ========================\n */\n\nexport const Wiki = z\n\t.object({\n\t\tid: z.string(),\n\t\ttitle: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Title at the top for this Wiki to continue\")\n\t\t\t.max(\n\t\t\t\tWIKI_TITLE_MAX_LENGTH,\n\t\t\t\t`Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t\t),\n\t\tcontent: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Content section to continue\")\n\t\t\t.refine(\n\t\t\t\thasMinimumWordCount,\n\t\t\t\t`Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue`,\n\t\t\t)\n\t\t\t.refine(\n\t\t\t\tcontainsOnlyVerifiedLinks,\n\t\t\t\t\"Please remove all external links from the content\",\n\t\t\t),\n\t\tsummary: z\n\t\t\t.string()\n\t\t\t.max(\n\t\t\t\tWIKI_SUMMARY_MAX_LENGTH,\n\t\t\t\t`Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t\t),\n\t\timages: z\n\t\t\t.array(Image)\n\t\t\t.min(1, \"Add a main image on the right column to continue\"),\n\t\tcategories: z.array(BaseCategory).min(1, \"Add one category to continue\"),\n\t\ttags: z\n\t\t\t.array(z.object({ id: z.string() }))\n\t\t\t.transform(transformAndFilterTags),\n\t\tmedia: z\n\t\t\t.array(Media)\n\t\t\t.max(MAX_MEDIA_COUNT)\n\t\t\t.refine(isMediaContentAndCountValid, \"Media is invalid\")\n\t\t\t.optional(),\n\t\tmetadata: z\n\t\t\t.array(MetaData)\n\t\t\t.refine(hasAtLeastOneReference, \"Please add at least one citation\")\n\t\t\t.transform(transformAndFilterMetadata),\n\t\tevents: z.array(BaseEvents).nullish(),\n\t\tuser: z.object({ id: z.string() }),\n\t\tauthor: z.object({ id: z.string() }),\n\t\tlanguage: LanguagesISO.default(LanguagesISO.Enum.en),\n\t\tversion: z.number().default(1),\n\t\tlinkedWikis: z\n\t\t\t.object({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: [],\n\t\t\t})\n\t\t\t.transform((val) => ({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]:\n\t\t\t\t\tval?.[LinkedWikiKey.Enum.blockchains] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? [],\n\t\t\t})),\n\t})\n\t.refine(isEventWikiValid, {\n\t\tmessage:\n\t\t\t\"Event wikis must have an event link citation and at least one event date\",\n\t\tpath: [\"events\"],\n\t});\n\nexport type Wiki = z.infer<typeof Wiki>;\n\nexport const Reference = z.object({\n\tid: z.string(),\n\tdescription: z.string(),\n\ttimestamp: z.number(),\n\turl: z.string(),\n});\nexport type Reference = z.infer<typeof Reference>;\n","import {\n\tCITATIONS_SCORE_WEIGHT,\n\tCONTENT_SCORE_WEIGHT,\n\tGOOD_CONTENT_WORD_COUNT,\n\tIDEAL_CITATIONS_COUNT,\n\tIDEAL_CONTENT_WORD_COUNT,\n\tIDEAL_INTERNAL_LINKS_COUNT,\n\tIDEAL_MEDIA_COUNT,\n\tIDEAL_SOCIAL_MEDIA_COUNT,\n\tIDEAL_SUMMARY_LENGTH,\n\tIDEAL_TAGS_COUNT,\n\tINTERNAL_LINKS_SCORE_WEIGHT,\n\tMEDIA_SCORE_WEIGHT,\n\tMIN_CONTENT_WORD_COUNT,\n\tSOCIAL_SCORE_WEIGHT,\n\tSUMMARY_SCORE_WEIGHT,\n\tTAGS_SCORE_WEIGHT,\n} from \"../data/constants\";\nimport { CommonMetaIds, type Wiki } from \"../schema\";\n\nconst contentQuality = (wordCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tlet score = 0;\n\n\tif (wordCount < MIN_CONTENT_WORD_COUNT) {\n\t\treturn scoreMin;\n\t}\n\n\tif (\n\t\twordCount >= MIN_CONTENT_WORD_COUNT &&\n\t\twordCount <= GOOD_CONTENT_WORD_COUNT\n\t) {\n\t\tscore = wordCount / GOOD_CONTENT_WORD_COUNT;\n\t\tscore *= 0.8;\n\t}\n\n\tif (\n\t\twordCount > GOOD_CONTENT_WORD_COUNT &&\n\t\twordCount < IDEAL_CONTENT_WORD_COUNT\n\t) {\n\t\tconst baseScore = 0.8;\n\t\tconst wordCountAboveGood = wordCount - GOOD_CONTENT_WORD_COUNT;\n\t\tconst extraScoreFactor =\n\t\t\twordCountAboveGood / (IDEAL_CONTENT_WORD_COUNT - GOOD_CONTENT_WORD_COUNT);\n\t\tconst extraScore = Math.sqrt(extraScoreFactor) * 0.2;\n\t\tscore = baseScore + extraScore;\n\t}\n\n\tif (wordCount >= IDEAL_CONTENT_WORD_COUNT) {\n\t\treturn scoreMax;\n\t}\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst countQuality = (idealCount: number, realCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tconst score = realCount / idealCount;\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst getHostnameFromRegex = (url: string) => {\n\tconst matches = RegExp(/^https?:\\/\\/([^/?#]+)(?:[/?#]|$)/i).exec(url);\n\treturn matches?.[1];\n};\n\nconst getWikiInternalLinks = (content: string): number => {\n\tconst markdownLinkRegex = /\\[(.*?)\\]\\((.*?)\\)/g;\n\tlet internalLinksCount = 0;\n\tlet match = markdownLinkRegex.exec(content);\n\n\twhile (match !== null) {\n\t\tconst url = match[2];\n\t\tif (url && !url.startsWith(\"#\")) {\n\t\t\tconst hostname = getHostnameFromRegex(url);\n\t\t\tif (\n\t\t\t\thostname === \"everipedia.org\" ||\n\t\t\t\thostname === \"iq.wiki\" ||\n\t\t\t\thostname?.endsWith(\".everipedia.org\")\n\t\t\t) {\n\t\t\t\tinternalLinksCount++;\n\t\t\t}\n\t\t}\n\t\tmatch = markdownLinkRegex.exec(content); // Move assignment here\n\t}\n\n\treturn internalLinksCount;\n};\n\nconst getWikiCitationLinks = (wiki: Wiki) => {\n\tconst rawWikiReferences = wiki.metadata.find(\n\t\t(m) => m.id === CommonMetaIds.Enum.references,\n\t)?.value;\n\n\tif (\n\t\trawWikiReferences === undefined ||\n\t\trawWikiReferences?.trim().length === 0\n\t) {\n\t\treturn 0;\n\t}\n\n\tconst wikiReferences = JSON.parse(rawWikiReferences);\n\n\treturn wikiReferences.length;\n};\n\nconst getSocialsCount = (wiki: Wiki): number => {\n\tlet socialsCount = 0;\n\tfor (const meta of wiki.metadata) {\n\t\tif (\n\t\t\tCommonMetaIds.options.includes(meta.id as keyof typeof CommonMetaIds.enum)\n\t\t) {\n\t\t\tif (meta.value) {\n\t\t\t\tsocialsCount += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn socialsCount;\n};\n\nexport const calculateWikiScore = (wiki: Wiki): number => {\n\tconst wordCount = wiki.content.split(\" \").length;\n\tconst internalLinksCount = getWikiInternalLinks(wiki.content);\n\tconst citationCount = getWikiCitationLinks(wiki);\n\tconst mediaCount = wiki.media?.length || 0;\n\tconst tagsCount = wiki.tags?.length || 0;\n\tconst summaryWordCount = wiki.summary?.length || 0;\n\tconst socialsCount = getSocialsCount(wiki);\n\n\tconst contentScore = contentQuality(wordCount);\n\tconst internalLinksScore = countQuality(\n\t\tIDEAL_INTERNAL_LINKS_COUNT,\n\t\tinternalLinksCount,\n\t);\n\tconst citationScore = countQuality(IDEAL_CITATIONS_COUNT, citationCount);\n\tconst mediaScore = countQuality(IDEAL_MEDIA_COUNT, mediaCount);\n\tconst tagsScore = countQuality(IDEAL_TAGS_COUNT, tagsCount);\n\tconst summaryScore = countQuality(IDEAL_SUMMARY_LENGTH, summaryWordCount);\n\tconst socialsScore = countQuality(IDEAL_SOCIAL_MEDIA_COUNT, socialsCount);\n\n\tconst sumOfWeights =\n\t\tCONTENT_SCORE_WEIGHT +\n\t\tINTERNAL_LINKS_SCORE_WEIGHT +\n\t\tCITATIONS_SCORE_WEIGHT +\n\t\tMEDIA_SCORE_WEIGHT +\n\t\tTAGS_SCORE_WEIGHT +\n\t\tSUMMARY_SCORE_WEIGHT +\n\t\tSOCIAL_SCORE_WEIGHT;\n\n\tconst score =\n\t\t(contentScore * CONTENT_SCORE_WEIGHT +\n\t\t\tinternalLinksScore * INTERNAL_LINKS_SCORE_WEIGHT +\n\t\t\tcitationScore * CITATIONS_SCORE_WEIGHT +\n\t\t\tmediaScore * MEDIA_SCORE_WEIGHT +\n\t\t\ttagsScore * TAGS_SCORE_WEIGHT +\n\t\t\tsummaryScore * SUMMARY_SCORE_WEIGHT +\n\t\t\tsocialsScore * SOCIAL_SCORE_WEIGHT) /\n\t\tsumOfWeights;\n\n\tconst percentScore = Math.floor(score * 100);\n\treturn percentScore;\n};\n","import {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tMEDIA_UPLOAD_PENDING_SUFFIX,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n} from \"../data/constants\";\nimport { CommonMetaIds, MediaSource, MediaType, type Wiki } from \"../schema\";\n\n/**\n * Counts the number of words in a given string.\n * @param text - The input string to count words from.\n * @returns The number of words in the string.\n */\nexport const countWords = (text: string) =>\n\ttext.split(\" \").filter((word) => word !== \"\").length;\n\n/**\n * Checks if a given string is a valid URL.\n * @param urlString - The string to check.\n * @returns True if the string is a valid URL, false otherwise.\n */\nexport const isValidUrl = (urlString: string) => {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Checks if all content links in the given text are verified.\n * @param content - The content to check for links.\n * @returns True if all links are verified, false otherwise.\n */\nexport const areContentLinksVerified = (content: string) => {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n};\n\n/**\n * Checks if the media in the wiki is valid.\n * @param wiki - The wiki object to check.\n * @returns True if the media is valid, false otherwise.\n */\nexport const isMediaValid = (wiki: Wiki) => {\n\tif (!wiki.media) return true;\n\n\tconst isMediaContentValid = wiki.media.every((media) => {\n\t\tif (\n\t\t\tmedia.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\tmedia.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn media.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*).*/;\n\t\t\treturn (\n\t\t\t\tmedia.id === `https://www.youtube.com/watch?v=${media.name}` &&\n\t\t\t\tyoutubePattern.test(media.id)\n\t\t\t);\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn media.id === `https://vimeo.com/${media.name}`;\n\t\t}\n\n\t\treturn media.type ? MediaType.options.includes(media.type) : true;\n\t});\n\n\tconst iconMediaCount = wiki.media.filter(\n\t\t(media) => media.type === MediaType.Enum.ICON,\n\t).length;\n\n\treturn (\n\t\twiki.media.length <= MAX_MEDIA_COUNT &&\n\t\tisMediaContentValid &&\n\t\ticonMediaCount <= 1\n\t);\n};\n\n/**\n * Checks if any media in the wiki is still uploading.\n * @param wiki - The wiki object to check.\n * @returns True if any media is still uploading, false otherwise.\n */\nexport const isAnyMediaUploading = (wiki: Wiki) =>\n\twiki.media?.some((media) => media.id.endsWith(MEDIA_UPLOAD_PENDING_SUFFIX)) ??\n\tfalse;\n\n/**\n * Checks if the event URL is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event URL is missing, false otherwise.\n */\nexport const isEventUrlMissing = (wiki: Wiki) => {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references = JSON.parse(referencesData);\n\t\treturn !references.some(\n\t\t\t(item: { description: string }) =>\n\t\t\t\titem.description.toLowerCase() === \"event link\",\n\t\t);\n\t}\n\treturn false;\n};\n\n/**\n * Checks if the event date is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event date is missing, false otherwise.\n */\nexport const isEventDateMissing = (wiki: Wiki) =>\n\twiki.tags.some((tag) => tag.id === \"Events\") && wiki.events?.length === 0;\n\n/**\n * Checks if the wiki summary exceeds the maximum length.\n * @param wiki - The wiki object to check.\n * @returns True if the summary exceeds the limit, false otherwise.\n */\nexport const isSummaryTooLong = (wiki: Wiki) =>\n\t!!(wiki.summary && wiki.summary.length > WIKI_SUMMARY_MAX_LENGTH);\n\n/**\n * Checks if the wiki has no citations.\n * @param wiki - The wiki object to check.\n * @returns True if there are no citations, false otherwise.\n */\nexport const hasNoCitations = (wiki: Wiki) => {\n\tconst references = wiki.metadata.find(\n\t\t(meta) => meta.id === CommonMetaIds.Enum.references,\n\t);\n\treturn !references?.value || references.value.length === 0;\n};\n\n/**\n * Validates a wiki object and returns the validation result.\n * @param wiki - The wiki object to validate.\n * @returns An object containing the validation result and an error message if applicable.\n */\nexport const validateWiki = (wiki: Wiki) => {\n\tconst wordCount = countWords(wiki.content || \"\");\n\n\tif (!wiki.title) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a Title at the top for this Wiki to continue\",\n\t\t};\n\t}\n\n\tif (wiki.title.length > WIKI_TITLE_MAX_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t};\n\t}\n\n\tif (!wiki.content) {\n\t\treturn { isValid: false, error: \"Add a Content section to continue\" };\n\t}\n\n\tif (wordCount < WIKI_CONTENT_MIN_WORDS) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue. You have written ${wordCount}`,\n\t\t};\n\t}\n\n\tif (!areContentLinksVerified(wiki.content)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Please remove all external links from the content\",\n\t\t};\n\t}\n\n\tif (!wiki.images?.length) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a main image on the right column to continue\",\n\t\t};\n\t}\n\n\tif (wiki.categories.length === 0) {\n\t\treturn { isValid: false, error: \"Add one category to continue\" };\n\t}\n\n\tif (isSummaryTooLong(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t};\n\t}\n\n\tif (isAnyMediaUploading(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Some media are still uploading, please wait\",\n\t\t};\n\t}\n\n\tif (hasNoCitations(wiki)) {\n\t\treturn { isValid: false, error: \"Please add at least one citation\" };\n\t}\n\n\tif (isEventUrlMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t\"Please cite the event official website with 'Event Link' description\",\n\t\t};\n\t}\n\n\tif (isEventDateMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t'Please open the \"Edit Wiki Details Modal\" and enter a valid event date',\n\t\t};\n\t}\n\n\tif (!isMediaValid(wiki)) {\n\t\treturn { isValid: false, error: \"Media is invalid\" };\n\t}\n\n\treturn { isValid: true };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/constants.ts","../src/lib/wiki-helpers.ts","../src/schema/index.ts","../src/lib/wiki-score.ts","../src/lib/check-wiki-validity.ts","../src/lib/twitter-api-client.ts"],"names":["QuickLRU","axios","z","Wiki","isMediaContentValid","OAuth","crypto"],"mappings":"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","file":"index.js","sourcesContent":["export const WIKI_SUMMARY_MAX_LENGTH = 255;\nexport const WIKI_CONTENT_MIN_WORDS = 100;\nexport const WIKI_TITLE_MAX_LENGTH = 60;\nexport const MEDIA_UPLOAD_PENDING_SUFFIX = \"default\";\nexport const MAX_MEDIA_COUNT = 25;\nexport const IPFS_HASH_LENGTH = 46;\nexport const EditorContentOverride = \"%OVERRIDE@EDITOR@MARKDOWN%\";\nexport const CreateNewWikiSlug = \"/*CREATE+NEW+WIKI*/\";\n\nexport const MIN_CONTENT_WORD_COUNT = 10;\nexport const GOOD_CONTENT_WORD_COUNT = 500;\nexport const IDEAL_CONTENT_WORD_COUNT = 1500;\n\nexport const CONTENT_SCORE_WEIGHT = 0.8;\nexport const INTERNAL_LINKS_SCORE_WEIGHT = 0.5;\nexport const CITATIONS_SCORE_WEIGHT = 0.5;\nexport const MEDIA_SCORE_WEIGHT = 0.3;\nexport const TAGS_SCORE_WEIGHT = 0.3;\nexport const SUMMARY_SCORE_WEIGHT = 0.5;\nexport const SOCIAL_SCORE_WEIGHT = 0.5;\n\nexport const IDEAL_INTERNAL_LINKS_COUNT = 10;\nexport const IDEAL_CITATIONS_COUNT = 10;\nexport const IDEAL_MEDIA_COUNT = 5;\nexport const IDEAL_TAGS_COUNT = 3;\nexport const IDEAL_SUMMARY_LENGTH = 100;\nexport const IDEAL_SOCIAL_MEDIA_COUNT = 4;\n\nexport const WHITELISTED_DOMAINS = [\n\t\"youtube.com/watch\",\n\t\"youtu.be\",\n\t\"vimeo.com\",\n\t\"alpha.everipedia.org/wiki\",\n\t\"beta.everipedia.org/wiki\",\n\t\"iq.wiki/wiki\",\n\t\"ipfs.everipedia.org/ipfs\",\n];\n\nexport const WHITELISTED_LINK_NAMES = [\"YOUTUBE@VID\", \"DUNE@EMBED\"];\n","import axios from \"axios\";\nimport QuickLRU from \"quick-lru\";\nimport {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n\tWIKI_CONTENT_MIN_WORDS,\n} from \"../data/constants\";\nimport {\n\tCommonMetaIds,\n\tEditSpecificMetaIds,\n\ttype Media,\n\tMediaSource,\n\tMediaType,\n\ttype MetaData,\n\tTag,\n\tWiki,\n} from \"../schema\";\n\n// ===============================\n// Text and content helpers\n// ===============================\n\n/**\n * Counts the number of words in a given string.\n * @param text - The input string to count words from.\n * @returns The number of words in the string.\n */\nexport function countWords(text: string): number {\n\treturn text.split(\" \").filter((word) => word !== \"\").length;\n}\n\n/**\n * Checks if a given string is a valid URL.\n * @param urlString - The string to check.\n * @returns True if the string is a valid URL, false otherwise.\n */\nexport const isValidUrl = (urlString: string) => {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n};\n\nexport function containsOnlyVerifiedLinks(content: string): boolean {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n}\n\n// ===============================\n// Media validation helpers\n// ===============================\nexport function isMediaContentValid(media: Media[]): boolean {\n\treturn media.every((item) => {\n\t\tif (\n\t\t\titem.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\titem.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn item.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*)(?:\\?si=[^#&?]*)?(?:\\?v=[^#&?]*)?(?:[#&].*)?$/;\n\t\t\treturn (\n\t\t\t\titem.id === `https://www.youtube.com/watch?v=${item.name}` &&\n\t\t\t\tyoutubePattern.test(item.id)\n\t\t\t);\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn item.id === `https://vimeo.com/${item.name}`;\n\t\t}\n\n\t\treturn item.type ? item.type in MediaType : true;\n\t});\n}\n\nexport function isMediaCountWithinLimits(media: Media[]): boolean {\n\tconst iconMediaCount = media.filter(\n\t\t(item) => item.type === MediaType.Enum.ICON,\n\t).length;\n\treturn media.length <= MAX_MEDIA_COUNT && iconMediaCount <= 1;\n}\n\nexport function isMediaContentAndCountValid(media: Media[]): boolean {\n\treturn isMediaContentValid(media) && isMediaCountWithinLimits(media);\n}\n\n// ===============================\n// Wiki-specific validation helpers\n// ===============================\nexport function isEventWikiValid(wiki: {\n\ttags: { id: string }[];\n\tmetadata: { id: string; value: string }[];\n\tevents: unknown[];\n}): boolean {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references: { description: string }[] = JSON.parse(\n\t\t\treferencesData,\n\t\t) as { description: string }[];\n\t\tconst hasEventLink = references.some(\n\t\t\t(item) => item.description.toLowerCase() === \"event link\",\n\t\t);\n\t\treturn hasEventLink && Array.isArray(wiki.events) && wiki.events.length > 0;\n\t}\n\treturn true;\n}\n\nexport function hasMinimumWordCount(content: string): boolean {\n\treturn countWords(content) >= WIKI_CONTENT_MIN_WORDS;\n}\n\n// ===============================\n// Metadata helpers\n// ===============================\nexport function hasAtLeastOneReference(metadata: MetaData[]): boolean {\n\tconst referencesData =\n\t\tmetadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value ||\n\t\t\"[]\";\n\tconst references = JSON.parse(referencesData) as { description: string }[];\n\treturn references.length > 0;\n}\n\nexport async function transformAndFilterMetadata(\n\tmetadata: MetaData[],\n): Promise<MetaData[]> {\n\tconst explorers = await getExplorers();\n\tconst validIds = new Set([\n\t\t...CommonMetaIds.options,\n\t\t...EditSpecificMetaIds.options,\n\t\t...explorers.map((e) => e.id),\n\t]);\n\n\treturn metadata.filter((meta) => {\n\t\tif (!validIds.has(meta.id)) return false;\n\n\t\tconst explorer = explorers.find((e) => e.id === meta.id);\n\t\tif (explorer) {\n\t\t\treturn (\n\t\t\t\tisValidUrl(meta.value) &&\n\t\t\t\tnew URL(meta.value).origin === new URL(explorer.baseUrl).origin\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n// ===============================\n// Tag helpers\n// ===============================\nexport function transformAndFilterTags(tags: { id: string }[]): { id: Tag }[] {\n\treturn tags\n\t\t.filter((tag) => Tag.safeParse(tag.id).success)\n\t\t.map((tag) => ({ id: tag.id as Tag }));\n}\n\n// ===============================\n// API-related helpers\n// ===============================\n\nconst cache = new QuickLRU({\n\tmaxSize: 1000,\n\tmaxAge: 12 * 60 * 60 * 1000, // 12 hours\n});\n\nexport const api = axios.create({\n\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\theaders: {\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\nexport async function getExplorers(): Promise<Explorer[]> {\n\tconst cacheKey = \"explorers\";\n\tconst cachedData = cache.get(cacheKey) as Explorer[];\n\n\tif (cachedData) {\n\t\treturn cachedData;\n\t}\n\n\tconst query = `\n query ExplorersList($offset: Int!, $limit: Int!) {\n explorers(offset: $offset, limit: $limit) {\n id\n baseUrl\n explorer\n hidden\n }\n }\n `;\n\n\tconst { data } = await api.post<{ data: { explorers: Explorer[] } }>(\"\", {\n\t\tquery,\n\t\tvariables: {\n\t\t\toffset: 0,\n\t\t\tlimit: 30,\n\t\t},\n\t});\n\n\tconst explorers = data.data.explorers;\n\tcache.set(cacheKey, explorers);\n\n\treturn explorers;\n}\n\n// ===============================\n// Types\n// ===============================\n\ninterface Explorer {\n\tid: string;\n\tbaseUrl: string;\n\texplorer: string;\n\thidden: boolean;\n}\n","import { z } from \"zod\";\n\nimport {\n\tMAX_MEDIA_COUNT,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n} from \"../data/constants\";\nimport {\n\ttransformAndFilterMetadata,\n\tcontainsOnlyVerifiedLinks,\n\thasAtLeastOneReference,\n\thasMinimumWordCount,\n\tisEventWikiValid,\n\tisMediaContentAndCountValid,\n\ttransformAndFilterTags,\n} from \"../lib/wiki-helpers\";\n\n/**\n * ========================\n * ===== Enum Schemas =====\n * ========================\n */\nexport const MediaType = z.enum([\"GALLERY\", \"ICON\"]);\nexport type MediaType = z.infer<typeof MediaType>;\n\nexport const MediaSource = z.enum([\"IPFS_IMG\", \"VIMEO\", \"YOUTUBE\", \"IPFS_VID\"]);\nexport type MediaSource = z.infer<typeof MediaSource>;\n\nexport const CommonMetaIds = z.enum([\n\t\"references\",\n\t\"website\",\n\t\"contract_url\",\n\t\"location\",\n\t\"email_url\",\n\t\"facebook_profile\",\n\t\"instagram_profile\",\n\t\"twitter_profile\",\n\t\"linkedin_profile\",\n\t\"youtube_profile\",\n\t\"discord_profile\",\n\t\"reddit_profile\",\n\t\"telegram_profile\",\n\t\"github_profile\",\n\t\"coinmarketcap_url\",\n\t\"coingecko_profile\",\n\t\"opensea_profile\",\n\t\"medium_profile\",\n\t\"mirror_profile\",\n\t\"tiktok_profile\",\n\t\"explorer_injective_profile\",\n]);\nexport type CommonMetaIds = z.infer<typeof CommonMetaIds>;\n\nexport const EditSpecificMetaIds = z.enum([\"previous_cid\", \"commit-message\"]);\nexport type EditSpecificMetaIds = z.infer<typeof EditSpecificMetaIds>;\n\nexport const ValidatorCodes = z.enum([\n\t\"VALID_WIKI\",\n\t\"ID_ERROR\",\n\t\"LANGUAGE_ERROR\",\n\t\"USER_ERROR\",\n\t\"WORD_COUNT_ERROR\",\n\t\"CATEGORY_ERROR\",\n\t\"SUMMARY_ERROR\",\n\t\"IMAGE_ERROR\",\n\t\"TAG_ERROR\",\n\t\"EXTERNAL_URL_ERROR\",\n\t\"METADATA_ERROR\",\n\t\"MEDIA_ERROR\",\n\t\"GLOBAL_RATE_LIMIT\",\n\t\"LINKED_WIKIS\",\n\t\"EVENTS_ERROR\",\n]);\nexport type ValidatorCodes = z.infer<typeof ValidatorCodes>;\n\nexport const LanguagesISO = z.enum([\"en\", \"es\", \"zh\", \"ko\"]);\nexport type LanguagesISO = z.infer<typeof LanguagesISO>;\n\nexport const LinkedWikiKey = z.enum([\"founders\", \"blockchains\", \"speakers\"]);\nexport type LinkedWikiKey = z.infer<typeof LinkedWikiKey>;\n\nexport const EventType = z.enum([\"CREATED\", \"DEFAULT\", \"MULTIDATE\"]);\nexport type EventType = z.infer<typeof EventType>;\n\nexport const Tag = z.enum([\n\t\"Artists\",\n\t\"AI\",\n\t\"BinanceSmartChain\",\n\t\"Blockchains\",\n\t\"CEXes\",\n\t\"Collections\",\n\t\"Collectors\",\n\t\"Conference\",\n\t\"DEXes\",\n\t\"Developers\",\n\t\"Entertainment\",\n\t\"Ethereum\",\n\t\"Events\",\n\t\"Forum\",\n\t\"Founders\",\n\t\"Festival\",\n\t\"Games\",\n\t\"Glossary\",\n\t\"Hackathon\",\n\t\"Marketplaces\",\n\t\"Memecoins\",\n\t\"Organizations\",\n\t\"Online\",\n\t\"PeopleInDeFi\",\n\t\"Polkadot\",\n\t\"Polygon\",\n\t\"Protocols\",\n\t\"Solana\",\n\t\"Speakers\",\n\t\"Stablecoins\",\n\t\"Venture\",\n]);\nexport type Tag = z.infer<typeof Tag>;\n\nexport const Category = z.enum([\n\t\"nfts\",\n\t\"defi\",\n\t\"exchanges\",\n\t\"cryptocurrencies\",\n\t\"daos\",\n\t\"people\",\n\t\"dapps\",\n\t\"organizations\",\n]);\nexport type Category = z.infer<typeof Category>;\n\n/**\n * ==============================\n * ===== Supporting Schemas =====\n * ==============================\n */\n\nexport const ProfileLinks = z.object({\n\ttwitter: z.string().nullable(),\n\twebsite: z.string().nullable(),\n\tinstagram: z.string().nullable(),\n});\nexport type ProfileLinks = z.infer<typeof ProfileLinks>;\n\nexport const ProfileData = z.object({\n\tid: z.string().nullable(),\n\tusername: z.string().nullable(),\n\tbio: z.string().nullable(),\n\tlinks: z.array(ProfileLinks).nullable(),\n\tbanner: z.string().nullable(),\n\tavatar: z.string().nullable(),\n});\nexport type ProfileData = z.infer<typeof ProfileData>;\n\nexport const Image = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n});\nexport type Image = z.infer<typeof Image>;\n\nexport const Media = z.object({\n\tid: z.string(),\n\tsize: z.union([z.string(), z.number()]).nullish(),\n\tname: z.string().nullish(),\n\ttype: MediaType.nullish(),\n\tcaption: z.string().nullish(),\n\tthumbnail: z.string().nullish(),\n\tsource: MediaSource,\n});\nexport type Media = z.infer<typeof Media>;\n\nconst MetaData = z.object({\n\tid: z.string(),\n\tvalue: z.any(),\n});\nexport type MetaData = z.infer<typeof MetaData>;\n\nexport const BaseCategory = z.object({\n\tid: Category,\n\ttitle: z.string(),\n});\nexport type BaseCategory = z.infer<typeof BaseCategory>;\n\nexport const BaseEvents = z.object({\n\tid: z.string().nullish(),\n\tdate: z.string().nullable(),\n\ttitle: z.string().nullish(),\n\ttype: EventType.nullable(),\n\tdescription: z.string().nullish(),\n\tlink: z.string().nullish(),\n\tmultiDateStart: z.string().nullish(),\n\tmultiDateEnd: z.string().nullish(),\n\tcontinent: z.string().nullish(),\n\tcountry: z.string().nullish(),\n\taction: z.enum([\"DELETE\", \"EDIT\", \"CREATE\"]).nullish(),\n});\nexport type BaseEvents = z.infer<typeof BaseEvents>;\n\n/**\n * ========================\n * ===== Core Schemas =====\n * ========================\n */\n\nexport const Wiki = z\n\t.object({\n\t\tid: z.string(),\n\t\ttitle: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Title at the top for this Wiki to continue\")\n\t\t\t.max(\n\t\t\t\tWIKI_TITLE_MAX_LENGTH,\n\t\t\t\t`Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t\t),\n\t\tcontent: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Content section to continue\")\n\t\t\t.refine(\n\t\t\t\thasMinimumWordCount,\n\t\t\t\t`Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue`,\n\t\t\t)\n\t\t\t.refine(\n\t\t\t\tcontainsOnlyVerifiedLinks,\n\t\t\t\t\"Please remove all external links from the content\",\n\t\t\t),\n\t\tsummary: z\n\t\t\t.string()\n\t\t\t.max(\n\t\t\t\tWIKI_SUMMARY_MAX_LENGTH,\n\t\t\t\t`Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t\t),\n\t\timages: z\n\t\t\t.array(Image)\n\t\t\t.min(1, \"Add a main image on the right column to continue\"),\n\t\tcategories: z.array(BaseCategory).min(1, \"Add one category to continue\"),\n\t\ttags: z\n\t\t\t.array(z.object({ id: z.string() }))\n\t\t\t.transform(transformAndFilterTags),\n\t\tmedia: z\n\t\t\t.array(Media)\n\t\t\t.max(MAX_MEDIA_COUNT)\n\t\t\t.refine(isMediaContentAndCountValid, \"Media is invalid\")\n\t\t\t.optional(),\n\t\tmetadata: z\n\t\t\t.array(MetaData)\n\t\t\t.refine(hasAtLeastOneReference, \"Please add at least one citation\")\n\t\t\t.transform(transformAndFilterMetadata),\n\t\tevents: z.array(BaseEvents).nullish(),\n\t\tuser: z.object({ id: z.string() }),\n\t\tauthor: z.object({ id: z.string() }),\n\t\tlanguage: LanguagesISO.default(LanguagesISO.Enum.en),\n\t\tversion: z.number().default(1),\n\t\tlinkedWikis: z\n\t\t\t.object({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: [],\n\t\t\t})\n\t\t\t.transform((val) => ({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]:\n\t\t\t\t\tval?.[LinkedWikiKey.Enum.blockchains] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? [],\n\t\t\t})),\n\t})\n\t.refine(\n\t\t(arg) =>\n\t\t\tisEventWikiValid(\n\t\t\t\targ as {\n\t\t\t\t\ttags: { id: string }[];\n\t\t\t\t\tmetadata: { id: string; value: string }[];\n\t\t\t\t\tevents: unknown[];\n\t\t\t\t},\n\t\t\t),\n\t\t{\n\t\t\tmessage:\n\t\t\t\t\"Event wikis must have an event link citation and at least one event date\",\n\t\t\tpath: [\"events\"],\n\t\t},\n\t);\nexport type Wiki = z.infer<typeof Wiki>;\n\nexport const Reference = z.object({\n\tid: z.string(),\n\tdescription: z.string(),\n\ttimestamp: z.number(),\n\turl: z.string(),\n});\nexport type Reference = z.infer<typeof Reference>;\n","import {\n\tCITATIONS_SCORE_WEIGHT,\n\tCONTENT_SCORE_WEIGHT,\n\tGOOD_CONTENT_WORD_COUNT,\n\tIDEAL_CITATIONS_COUNT,\n\tIDEAL_CONTENT_WORD_COUNT,\n\tIDEAL_INTERNAL_LINKS_COUNT,\n\tIDEAL_MEDIA_COUNT,\n\tIDEAL_SOCIAL_MEDIA_COUNT,\n\tIDEAL_SUMMARY_LENGTH,\n\tIDEAL_TAGS_COUNT,\n\tINTERNAL_LINKS_SCORE_WEIGHT,\n\tMEDIA_SCORE_WEIGHT,\n\tMIN_CONTENT_WORD_COUNT,\n\tSOCIAL_SCORE_WEIGHT,\n\tSUMMARY_SCORE_WEIGHT,\n\tTAGS_SCORE_WEIGHT,\n} from \"../data/constants\";\nimport { CommonMetaIds, type Wiki } from \"../schema\";\n\nconst contentQuality = (wordCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tlet score = 0;\n\n\tif (wordCount < MIN_CONTENT_WORD_COUNT) {\n\t\treturn scoreMin;\n\t}\n\n\tif (\n\t\twordCount >= MIN_CONTENT_WORD_COUNT &&\n\t\twordCount <= GOOD_CONTENT_WORD_COUNT\n\t) {\n\t\tscore = wordCount / GOOD_CONTENT_WORD_COUNT;\n\t\tscore *= 0.8;\n\t}\n\n\tif (\n\t\twordCount > GOOD_CONTENT_WORD_COUNT &&\n\t\twordCount < IDEAL_CONTENT_WORD_COUNT\n\t) {\n\t\tconst baseScore = 0.8;\n\t\tconst wordCountAboveGood = wordCount - GOOD_CONTENT_WORD_COUNT;\n\t\tconst extraScoreFactor =\n\t\t\twordCountAboveGood / (IDEAL_CONTENT_WORD_COUNT - GOOD_CONTENT_WORD_COUNT);\n\t\tconst extraScore = Math.sqrt(extraScoreFactor) * 0.2;\n\t\tscore = baseScore + extraScore;\n\t}\n\n\tif (wordCount >= IDEAL_CONTENT_WORD_COUNT) {\n\t\treturn scoreMax;\n\t}\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst countQuality = (idealCount: number, realCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tconst score = realCount / idealCount;\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst getHostnameFromRegex = (url: string) => {\n\tconst matches = RegExp(/^https?:\\/\\/([^/?#]+)(?:[/?#]|$)/i).exec(url);\n\treturn matches?.[1];\n};\n\nconst getWikiInternalLinks = (content: string): number => {\n\tconst markdownLinkRegex = /\\[(.*?)\\]\\((.*?)\\)/g;\n\tlet internalLinksCount = 0;\n\tlet match = markdownLinkRegex.exec(content);\n\n\twhile (match !== null) {\n\t\tconst url = match[2];\n\t\tif (url && !url.startsWith(\"#\")) {\n\t\t\tconst hostname = getHostnameFromRegex(url);\n\t\t\tif (\n\t\t\t\thostname === \"everipedia.org\" ||\n\t\t\t\thostname === \"iq.wiki\" ||\n\t\t\t\thostname?.endsWith(\".everipedia.org\")\n\t\t\t) {\n\t\t\t\tinternalLinksCount++;\n\t\t\t}\n\t\t}\n\t\tmatch = markdownLinkRegex.exec(content); // Move assignment here\n\t}\n\n\treturn internalLinksCount;\n};\n\nconst getWikiCitationLinks = (wiki: Wiki) => {\n\tconst rawWikiReferences = wiki.metadata.find(\n\t\t(m) => m.id === CommonMetaIds.Enum.references,\n\t)?.value;\n\n\tif (\n\t\trawWikiReferences === undefined ||\n\t\trawWikiReferences?.trim().length === 0\n\t) {\n\t\treturn 0;\n\t}\n\n\tconst wikiReferences = JSON.parse(rawWikiReferences);\n\n\treturn wikiReferences.length;\n};\n\nconst getSocialsCount = (wiki: Wiki): number => {\n\tlet socialsCount = 0;\n\tfor (const meta of wiki.metadata) {\n\t\tif (\n\t\t\tCommonMetaIds.options.includes(meta.id as keyof typeof CommonMetaIds.enum)\n\t\t) {\n\t\t\tif (meta.value) {\n\t\t\t\tsocialsCount += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn socialsCount;\n};\n\nexport const calculateWikiScore = (wiki: Wiki): number => {\n\tconst wordCount = wiki.content.split(\" \").length;\n\tconst internalLinksCount = getWikiInternalLinks(wiki.content);\n\tconst citationCount = getWikiCitationLinks(wiki);\n\tconst mediaCount = wiki.media?.length || 0;\n\tconst tagsCount = wiki.tags?.length || 0;\n\tconst summaryWordCount = wiki.summary?.length || 0;\n\tconst socialsCount = getSocialsCount(wiki);\n\n\tconst contentScore = contentQuality(wordCount);\n\tconst internalLinksScore = countQuality(\n\t\tIDEAL_INTERNAL_LINKS_COUNT,\n\t\tinternalLinksCount,\n\t);\n\tconst citationScore = countQuality(IDEAL_CITATIONS_COUNT, citationCount);\n\tconst mediaScore = countQuality(IDEAL_MEDIA_COUNT, mediaCount);\n\tconst tagsScore = countQuality(IDEAL_TAGS_COUNT, tagsCount);\n\tconst summaryScore = countQuality(IDEAL_SUMMARY_LENGTH, summaryWordCount);\n\tconst socialsScore = countQuality(IDEAL_SOCIAL_MEDIA_COUNT, socialsCount);\n\n\tconst sumOfWeights =\n\t\tCONTENT_SCORE_WEIGHT +\n\t\tINTERNAL_LINKS_SCORE_WEIGHT +\n\t\tCITATIONS_SCORE_WEIGHT +\n\t\tMEDIA_SCORE_WEIGHT +\n\t\tTAGS_SCORE_WEIGHT +\n\t\tSUMMARY_SCORE_WEIGHT +\n\t\tSOCIAL_SCORE_WEIGHT;\n\n\tconst score =\n\t\t(contentScore * CONTENT_SCORE_WEIGHT +\n\t\t\tinternalLinksScore * INTERNAL_LINKS_SCORE_WEIGHT +\n\t\t\tcitationScore * CITATIONS_SCORE_WEIGHT +\n\t\t\tmediaScore * MEDIA_SCORE_WEIGHT +\n\t\t\ttagsScore * TAGS_SCORE_WEIGHT +\n\t\t\tsummaryScore * SUMMARY_SCORE_WEIGHT +\n\t\t\tsocialsScore * SOCIAL_SCORE_WEIGHT) /\n\t\tsumOfWeights;\n\n\tconst percentScore = Math.floor(score * 100);\n\treturn percentScore;\n};\n","import {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tMEDIA_UPLOAD_PENDING_SUFFIX,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n} from \"../data/constants\";\nimport { CommonMetaIds, MediaSource, MediaType, type Wiki } from \"../schema\";\nimport { countWords, isValidUrl } from \"./wiki-helpers\";\n\n/**\n * Checks if all content links in the given text are verified.\n * @param content - The content to check for links.\n * @returns True if all links are verified, false otherwise.\n */\nexport const areContentLinksVerified = (content: string) => {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n};\n\n/**\n * Checks if the media in the wiki is valid.\n * @param wiki - The wiki object to check.\n * @returns True if the media is valid, false otherwise.\n */\nexport const isMediaValid = (wiki: Wiki) => {\n\tif (!wiki.media) return true;\n\n\tconst isMediaContentValid = wiki.media.every((media) => {\n\t\tif (\n\t\t\tmedia.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\tmedia.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn media.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*).*/;\n\t\t\treturn (\n\t\t\t\tmedia.id === `https://www.youtube.com/watch?v=${media.name}` &&\n\t\t\t\tyoutubePattern.test(media.id)\n\t\t\t);\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn media.id === `https://vimeo.com/${media.name}`;\n\t\t}\n\n\t\treturn media.type ? MediaType.options.includes(media.type) : true;\n\t});\n\n\tconst iconMediaCount = wiki.media.filter(\n\t\t(media) => media.type === MediaType.Enum.ICON,\n\t).length;\n\n\treturn (\n\t\twiki.media.length <= MAX_MEDIA_COUNT &&\n\t\tisMediaContentValid &&\n\t\ticonMediaCount <= 1\n\t);\n};\n\n/**\n * Checks if any media in the wiki is still uploading.\n * @param wiki - The wiki object to check.\n * @returns True if any media is still uploading, false otherwise.\n */\nexport const isAnyMediaUploading = (wiki: Wiki) =>\n\twiki.media?.some((media) => media.id.endsWith(MEDIA_UPLOAD_PENDING_SUFFIX)) ??\n\tfalse;\n\n/**\n * Checks if the event URL is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event URL is missing, false otherwise.\n */\nexport const isEventUrlMissing = (wiki: Wiki) => {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references = JSON.parse(referencesData);\n\t\treturn !references.some(\n\t\t\t(item: { description: string }) =>\n\t\t\t\titem.description.toLowerCase() === \"event link\",\n\t\t);\n\t}\n\treturn false;\n};\n\n/**\n * Checks if the event date is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event date is missing, false otherwise.\n */\nexport const isEventDateMissing = (wiki: Wiki) =>\n\twiki.tags.some((tag) => tag.id === \"Events\") && wiki.events?.length === 0;\n\n/**\n * Checks if the wiki summary exceeds the maximum length.\n * @param wiki - The wiki object to check.\n * @returns True if the summary exceeds the limit, false otherwise.\n */\nexport const isSummaryTooLong = (wiki: Wiki) =>\n\t!!(wiki.summary && wiki.summary.length > WIKI_SUMMARY_MAX_LENGTH);\n\n/**\n * Checks if the wiki has no citations.\n * @param wiki - The wiki object to check.\n * @returns True if there are no citations, false otherwise.\n */\nexport const hasNoCitations = (wiki: Wiki) => {\n\tconst references = wiki.metadata.find(\n\t\t(meta) => meta.id === CommonMetaIds.Enum.references,\n\t);\n\treturn !references?.value || references.value.length === 0;\n};\n\n/**\n * Validates a wiki object and returns the validation result.\n * @param wiki - The wiki object to validate.\n * @returns An object containing the validation result and an error message if applicable.\n */\nexport const validateWiki = (wiki: Wiki) => {\n\tconst wordCount = countWords(wiki.content || \"\");\n\n\tif (!wiki.title) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a Title at the top for this Wiki to continue\",\n\t\t};\n\t}\n\n\tif (wiki.title.length > WIKI_TITLE_MAX_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t};\n\t}\n\n\tif (!wiki.content) {\n\t\treturn { isValid: false, error: \"Add a Content section to continue\" };\n\t}\n\n\tif (wordCount < WIKI_CONTENT_MIN_WORDS) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue. You have written ${wordCount}`,\n\t\t};\n\t}\n\n\tif (!areContentLinksVerified(wiki.content)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Please remove all external links from the content\",\n\t\t};\n\t}\n\n\tif (!wiki.images?.length) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a main image on the right column to continue\",\n\t\t};\n\t}\n\n\tif (wiki.categories.length === 0) {\n\t\treturn { isValid: false, error: \"Add one category to continue\" };\n\t}\n\n\tif (isSummaryTooLong(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t};\n\t}\n\n\tif (isAnyMediaUploading(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Some media are still uploading, please wait\",\n\t\t};\n\t}\n\n\tif (hasNoCitations(wiki)) {\n\t\treturn { isValid: false, error: \"Please add at least one citation\" };\n\t}\n\n\tif (isEventUrlMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t\"Please cite the event official website with 'Event Link' description\",\n\t\t};\n\t}\n\n\tif (isEventDateMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t'Please open the \"Edit Wiki Details Modal\" and enter a valid event date',\n\t\t};\n\t}\n\n\tif (!isMediaValid(wiki)) {\n\t\treturn { isValid: false, error: \"Media is invalid\" };\n\t}\n\n\treturn { isValid: true };\n};\n","import crypto from \"node:crypto\";\nimport OAuth from \"oauth-1.0a\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\ninterface IDiscordLogger {\n\tlog(data: DiscordLogData): Promise<void>;\n}\n\ntype DiscordLogData = {\n\tmessage: string;\n\ttitle?: string;\n\tcolor?: number;\n};\n\nexport const oauth = new OAuth({\n\tconsumer: {\n\t\tkey: process.env.TWITTER_CONSUMER_KEY ?? \"\",\n\t\tsecret: process.env.TWITTER_CONSUMER_SECRET ?? \"\",\n\t},\n\tsignature_method: \"HMAC-SHA1\",\n\thash_function: (base_string, key) => {\n\t\treturn crypto.createHmac(\"sha1\", key).update(base_string).digest(\"base64\");\n\t},\n});\n\nconst twitterAuthConfig = {\n\tkey: process.env.TWITTER_ACCESS_TOKEN ?? \"\",\n\tsecret: process.env.TWITTER_ACCESS_TOKEN_SECRET ?? \"\",\n};\n\nexport async function sendTwitterApiRequest(\n\turl: string,\n\tmethod: HttpMethod,\n\tlogger?: IDiscordLogger,\n\tbody?: string,\n): Promise<Response> {\n\tif (!url.startsWith(\"https://api.twitter.com/\")) {\n\t\tthrow new Error(\"Invalid Twitter API URL\");\n\t}\n\tconst oauth_headers = oauth.toHeader(\n\t\toauth.authorize(\n\t\t\t{\n\t\t\t\turl,\n\t\t\t\tmethod,\n\t\t\t},\n\t\t\ttwitterAuthConfig,\n\t\t),\n\t);\n\n\tconst response = await fetch(url, {\n\t\tmethod,\n\t\theaders: {\n\t\t\t...oauth_headers,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorBody = await response.text();\n\t\tlogger?.log({\n\t\t\tmessage: `🚨 HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,\n\t\t\ttitle: \"Twitter Authentication: makeAuthenticatedRequest\",\n\t\t});\n\t\tthrow new Error(\n\t\t\t`HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,\n\t\t);\n\t}\n\n\treturn response;\n}\n"]}
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import axios from 'axios';
|
|
3
3
|
import QuickLRU from 'quick-lru';
|
|
4
|
+
import crypto from 'node:crypto';
|
|
5
|
+
import OAuth from 'oauth-1.0a';
|
|
4
6
|
|
|
5
7
|
// src/data/constants.ts
|
|
6
8
|
var WIKI_SUMMARY_MAX_LENGTH = 255;
|
|
@@ -40,13 +42,13 @@ var WHITELISTED_LINK_NAMES = ["YOUTUBE@VID", "DUNE@EMBED"];
|
|
|
40
42
|
function countWords(text) {
|
|
41
43
|
return text.split(" ").filter((word) => word !== "").length;
|
|
42
44
|
}
|
|
43
|
-
|
|
45
|
+
var isValidUrl = (urlString) => {
|
|
44
46
|
try {
|
|
45
47
|
return Boolean(new URL(urlString));
|
|
46
48
|
} catch (_e) {
|
|
47
49
|
return false;
|
|
48
50
|
}
|
|
49
|
-
}
|
|
51
|
+
};
|
|
50
52
|
function containsOnlyVerifiedLinks(content) {
|
|
51
53
|
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
52
54
|
return markdownLinks?.every((link) => {
|
|
@@ -89,9 +91,7 @@ function isMediaContentAndCountValid(media) {
|
|
|
89
91
|
}
|
|
90
92
|
function isEventWikiValid(wiki) {
|
|
91
93
|
if (wiki.tags.some((tag) => tag.id === "Events")) {
|
|
92
|
-
const referencesData = wiki.metadata.find(
|
|
93
|
-
(meta) => meta.id === CommonMetaIds.Enum.references
|
|
94
|
-
)?.value || "[]";
|
|
94
|
+
const referencesData = wiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value || "[]";
|
|
95
95
|
const references = JSON.parse(
|
|
96
96
|
referencesData
|
|
97
97
|
);
|
|
@@ -305,7 +305,7 @@ var BaseEvents = z.object({
|
|
|
305
305
|
country: z.string().nullish(),
|
|
306
306
|
action: z.enum(["DELETE", "EDIT", "CREATE"]).nullish()
|
|
307
307
|
});
|
|
308
|
-
var
|
|
308
|
+
var Wiki2 = z.object({
|
|
309
309
|
id: z.string(),
|
|
310
310
|
title: z.string().min(1, "Add a Title at the top for this Wiki to continue").max(
|
|
311
311
|
WIKI_TITLE_MAX_LENGTH,
|
|
@@ -345,10 +345,15 @@ var Wiki = z.object({
|
|
|
345
345
|
[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],
|
|
346
346
|
[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? []
|
|
347
347
|
}))
|
|
348
|
-
}).refine(
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
348
|
+
}).refine(
|
|
349
|
+
(arg) => isEventWikiValid(
|
|
350
|
+
arg
|
|
351
|
+
),
|
|
352
|
+
{
|
|
353
|
+
message: "Event wikis must have an event link citation and at least one event date",
|
|
354
|
+
path: ["events"]
|
|
355
|
+
}
|
|
356
|
+
);
|
|
352
357
|
var Reference = z.object({
|
|
353
358
|
id: z.string(),
|
|
354
359
|
description: z.string(),
|
|
@@ -464,19 +469,11 @@ var calculateWikiScore = (wiki) => {
|
|
|
464
469
|
};
|
|
465
470
|
|
|
466
471
|
// src/lib/check-wiki-validity.ts
|
|
467
|
-
var countWords2 = (text) => text.split(" ").filter((word) => word !== "").length;
|
|
468
|
-
var isValidUrl2 = (urlString) => {
|
|
469
|
-
try {
|
|
470
|
-
return Boolean(new URL(urlString));
|
|
471
|
-
} catch (_e) {
|
|
472
|
-
return false;
|
|
473
|
-
}
|
|
474
|
-
};
|
|
475
472
|
var areContentLinksVerified = (content) => {
|
|
476
473
|
const markdownLinks = content.match(/\[(.*?)\]\((.*?)\)/g);
|
|
477
474
|
return markdownLinks?.every((link) => {
|
|
478
475
|
const [, linkText, linkUrl] = RegExp(/\[(.*?)\]\((.*?)\)/).exec(link) || [];
|
|
479
|
-
if (linkText && linkUrl && WHITELISTED_LINK_NAMES.includes(linkText) && !
|
|
476
|
+
if (linkText && linkUrl && WHITELISTED_LINK_NAMES.includes(linkText) && !isValidUrl(linkUrl)) {
|
|
480
477
|
return true;
|
|
481
478
|
}
|
|
482
479
|
if (linkUrl && !linkUrl.startsWith("#")) {
|
|
@@ -528,7 +525,7 @@ var hasNoCitations = (wiki) => {
|
|
|
528
525
|
return !references?.value || references.value.length === 0;
|
|
529
526
|
};
|
|
530
527
|
var validateWiki = (wiki) => {
|
|
531
|
-
const wordCount =
|
|
528
|
+
const wordCount = countWords(wiki.content || "");
|
|
532
529
|
if (!wiki.title) {
|
|
533
530
|
return {
|
|
534
531
|
isValid: false,
|
|
@@ -597,7 +594,54 @@ var validateWiki = (wiki) => {
|
|
|
597
594
|
}
|
|
598
595
|
return { isValid: true };
|
|
599
596
|
};
|
|
597
|
+
var oauth = new OAuth({
|
|
598
|
+
consumer: {
|
|
599
|
+
key: process.env.TWITTER_CONSUMER_KEY ?? "",
|
|
600
|
+
secret: process.env.TWITTER_CONSUMER_SECRET ?? ""
|
|
601
|
+
},
|
|
602
|
+
signature_method: "HMAC-SHA1",
|
|
603
|
+
hash_function: (base_string, key) => {
|
|
604
|
+
return crypto.createHmac("sha1", key).update(base_string).digest("base64");
|
|
605
|
+
}
|
|
606
|
+
});
|
|
607
|
+
var twitterAuthConfig = {
|
|
608
|
+
key: process.env.TWITTER_ACCESS_TOKEN ?? "",
|
|
609
|
+
secret: process.env.TWITTER_ACCESS_TOKEN_SECRET ?? ""
|
|
610
|
+
};
|
|
611
|
+
async function sendTwitterApiRequest(url, method, logger, body) {
|
|
612
|
+
if (!url.startsWith("https://api.twitter.com/")) {
|
|
613
|
+
throw new Error("Invalid Twitter API URL");
|
|
614
|
+
}
|
|
615
|
+
const oauth_headers = oauth.toHeader(
|
|
616
|
+
oauth.authorize(
|
|
617
|
+
{
|
|
618
|
+
url,
|
|
619
|
+
method
|
|
620
|
+
},
|
|
621
|
+
twitterAuthConfig
|
|
622
|
+
)
|
|
623
|
+
);
|
|
624
|
+
const response = await fetch(url, {
|
|
625
|
+
method,
|
|
626
|
+
headers: {
|
|
627
|
+
...oauth_headers,
|
|
628
|
+
"Content-Type": "application/json"
|
|
629
|
+
},
|
|
630
|
+
body
|
|
631
|
+
});
|
|
632
|
+
if (!response.ok) {
|
|
633
|
+
const errorBody = await response.text();
|
|
634
|
+
logger?.log({
|
|
635
|
+
message: `\u{1F6A8} HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,
|
|
636
|
+
title: "Twitter Authentication: makeAuthenticatedRequest"
|
|
637
|
+
});
|
|
638
|
+
throw new Error(
|
|
639
|
+
`HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`
|
|
640
|
+
);
|
|
641
|
+
}
|
|
642
|
+
return response;
|
|
643
|
+
}
|
|
600
644
|
|
|
601
|
-
export { BaseCategory, BaseEvents, CITATIONS_SCORE_WEIGHT, CONTENT_SCORE_WEIGHT, Category, CommonMetaIds, CreateNewWikiSlug, EditSpecificMetaIds, EditorContentOverride, EventType, 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, IPFS_HASH_LENGTH, Image, LanguagesISO, LinkedWikiKey, MAX_MEDIA_COUNT, MEDIA_SCORE_WEIGHT, MEDIA_UPLOAD_PENDING_SUFFIX, MIN_CONTENT_WORD_COUNT, Media, MediaSource, MediaType, ProfileData, ProfileLinks, Reference, SOCIAL_SCORE_WEIGHT, SUMMARY_SCORE_WEIGHT, TAGS_SCORE_WEIGHT, Tag, ValidatorCodes, WHITELISTED_DOMAINS, WHITELISTED_LINK_NAMES, WIKI_CONTENT_MIN_WORDS, WIKI_SUMMARY_MAX_LENGTH, WIKI_TITLE_MAX_LENGTH, Wiki, areContentLinksVerified, calculateWikiScore,
|
|
645
|
+
export { BaseCategory, BaseEvents, CITATIONS_SCORE_WEIGHT, CONTENT_SCORE_WEIGHT, Category, CommonMetaIds, CreateNewWikiSlug, EditSpecificMetaIds, EditorContentOverride, EventType, 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, IPFS_HASH_LENGTH, Image, LanguagesISO, LinkedWikiKey, MAX_MEDIA_COUNT, MEDIA_SCORE_WEIGHT, MEDIA_UPLOAD_PENDING_SUFFIX, MIN_CONTENT_WORD_COUNT, Media, MediaSource, MediaType, ProfileData, ProfileLinks, Reference, SOCIAL_SCORE_WEIGHT, SUMMARY_SCORE_WEIGHT, TAGS_SCORE_WEIGHT, Tag, ValidatorCodes, WHITELISTED_DOMAINS, WHITELISTED_LINK_NAMES, WIKI_CONTENT_MIN_WORDS, WIKI_SUMMARY_MAX_LENGTH, WIKI_TITLE_MAX_LENGTH, Wiki2 as Wiki, api, areContentLinksVerified, calculateWikiScore, containsOnlyVerifiedLinks, countWords, getExplorers, hasAtLeastOneReference, hasMinimumWordCount, hasNoCitations, isAnyMediaUploading, isEventDateMissing, isEventUrlMissing, isEventWikiValid, isMediaContentAndCountValid, isMediaContentValid, isMediaCountWithinLimits, isMediaValid, isSummaryTooLong, isValidUrl, oauth, sendTwitterApiRequest, transformAndFilterMetadata, transformAndFilterTags, validateWiki };
|
|
602
646
|
//# sourceMappingURL=index.mjs.map
|
|
603
647
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/data/constants.ts","../src/lib/wiki-helpers.ts","../src/schema/index.ts","../src/lib/wiki-score.ts","../src/lib/check-wiki-validity.ts"],"names":["countWords","isValidUrl","isMediaContentValid"],"mappings":"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","file":"index.mjs","sourcesContent":["export const WIKI_SUMMARY_MAX_LENGTH = 255;\nexport const WIKI_CONTENT_MIN_WORDS = 100;\nexport const WIKI_TITLE_MAX_LENGTH = 60;\nexport const MEDIA_UPLOAD_PENDING_SUFFIX = \"default\";\nexport const MAX_MEDIA_COUNT = 25;\nexport const IPFS_HASH_LENGTH = 46;\nexport const EditorContentOverride = \"%OVERRIDE@EDITOR@MARKDOWN%\";\nexport const CreateNewWikiSlug = \"/*CREATE+NEW+WIKI*/\";\n\nexport const MIN_CONTENT_WORD_COUNT = 10;\nexport const GOOD_CONTENT_WORD_COUNT = 500;\nexport const IDEAL_CONTENT_WORD_COUNT = 1500;\n\nexport const CONTENT_SCORE_WEIGHT = 0.8;\nexport const INTERNAL_LINKS_SCORE_WEIGHT = 0.5;\nexport const CITATIONS_SCORE_WEIGHT = 0.5;\nexport const MEDIA_SCORE_WEIGHT = 0.3;\nexport const TAGS_SCORE_WEIGHT = 0.3;\nexport const SUMMARY_SCORE_WEIGHT = 0.5;\nexport const SOCIAL_SCORE_WEIGHT = 0.5;\n\nexport const IDEAL_INTERNAL_LINKS_COUNT = 10;\nexport const IDEAL_CITATIONS_COUNT = 10;\nexport const IDEAL_MEDIA_COUNT = 5;\nexport const IDEAL_TAGS_COUNT = 3;\nexport const IDEAL_SUMMARY_LENGTH = 100;\nexport const IDEAL_SOCIAL_MEDIA_COUNT = 4;\n\nexport const WHITELISTED_DOMAINS = [\n\t\"youtube.com/watch\",\n\t\"youtu.be\",\n\t\"vimeo.com\",\n\t\"alpha.everipedia.org/wiki\",\n\t\"beta.everipedia.org/wiki\",\n\t\"iq.wiki/wiki\",\n\t\"ipfs.everipedia.org/ipfs\",\n];\n\nexport const WHITELISTED_LINK_NAMES = [\"YOUTUBE@VID\", \"DUNE@EMBED\"];\n","import axios from \"axios\";\nimport QuickLRU from \"quick-lru\";\nimport {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n\tWIKI_CONTENT_MIN_WORDS,\n} from \"../data/constants\";\nimport {\n\tCommonMetaIds,\n\tEditSpecificMetaIds,\n\ttype Media,\n\tMediaSource,\n\tMediaType,\n\ttype MetaData,\n\tTag,\n} from \"../schema\";\n\n// ===============================\n// Text and content helpers\n// ===============================\n\nexport function countWords(text: string): number {\n\treturn text.split(\" \").filter((word) => word !== \"\").length;\n}\n\nexport function isValidUrl(urlString: string): boolean {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n}\n\nexport function containsOnlyVerifiedLinks(content: string): boolean {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n}\n\n// ===============================\n// Media validation helpers\n// ===============================\nexport function isMediaContentValid(media: Media[]): boolean {\n\treturn media.every((item) => {\n\t\tif (\n\t\t\titem.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\titem.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn item.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*)(?:\\?si=[^#&?]*)?(?:\\?v=[^#&?]*)?(?:[#&].*)?$/;\n\t\t\treturn (\n\t\t\t\titem.id === `https://www.youtube.com/watch?v=${item.name}` &&\n\t\t\t\tyoutubePattern.test(item.id)\n\t\t\t);\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn item.id === `https://vimeo.com/${item.name}`;\n\t\t}\n\n\t\treturn item.type ? item.type in MediaType : true;\n\t});\n}\n\nexport function isMediaCountWithinLimits(media: Media[]): boolean {\n\tconst iconMediaCount = media.filter(\n\t\t(item) => item.type === MediaType.Enum.ICON,\n\t).length;\n\treturn media.length <= MAX_MEDIA_COUNT && iconMediaCount <= 1;\n}\n\nexport function isMediaContentAndCountValid(media: Media[]): boolean {\n\treturn isMediaContentValid(media) && isMediaCountWithinLimits(media);\n}\n\n// ===============================\n// Wiki-specific validation helpers\n// ===============================\nexport function isEventWikiValid(wiki: any): boolean {\n\tif (wiki.tags.some((tag: any) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find(\n\t\t\t\t(meta: any) => meta.id === CommonMetaIds.Enum.references,\n\t\t\t)?.value || \"[]\";\n\t\tconst references: { description: string }[] = JSON.parse(\n\t\t\treferencesData,\n\t\t) as { description: string }[];\n\t\tconst hasEventLink = references.some(\n\t\t\t(item) => item.description.toLowerCase() === \"event link\",\n\t\t);\n\t\treturn hasEventLink && Array.isArray(wiki.events) && wiki.events.length > 0;\n\t}\n\treturn true;\n}\n\nexport function hasMinimumWordCount(content: string): boolean {\n\treturn countWords(content) >= WIKI_CONTENT_MIN_WORDS;\n}\n\n// ===============================\n// Metadata helpers\n// ===============================\nexport function hasAtLeastOneReference(metadata: MetaData[]): boolean {\n\tconst referencesData =\n\t\tmetadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value ||\n\t\t\"[]\";\n\tconst references = JSON.parse(referencesData) as { description: string }[];\n\treturn references.length > 0;\n}\n\nexport async function transformAndFilterMetadata(\n\tmetadata: MetaData[],\n): Promise<MetaData[]> {\n\tconst explorers = await getExplorers();\n\tconst validIds = new Set([\n\t\t...CommonMetaIds.options,\n\t\t...EditSpecificMetaIds.options,\n\t\t...explorers.map((e) => e.id),\n\t]);\n\n\treturn metadata.filter((meta) => {\n\t\tif (!validIds.has(meta.id)) return false;\n\n\t\tconst explorer = explorers.find((e) => e.id === meta.id);\n\t\tif (explorer) {\n\t\t\treturn (\n\t\t\t\tisValidUrl(meta.value) &&\n\t\t\t\tnew URL(meta.value).origin === new URL(explorer.baseUrl).origin\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n// ===============================\n// Tag helpers\n// ===============================\nexport function transformAndFilterTags(tags: { id: string }[]): { id: Tag }[] {\n\treturn tags\n\t\t.filter((tag) => Tag.safeParse(tag.id).success)\n\t\t.map((tag) => ({ id: tag.id as Tag }));\n}\n\n// ===============================\n// API-related helpers\n// ===============================\n\nconst cache = new QuickLRU({\n\tmaxSize: 1000,\n\tmaxAge: 12 * 60 * 60 * 1000, // 12 hours\n});\n\nexport const api = axios.create({\n\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\theaders: {\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\nexport async function getExplorers(): Promise<Explorer[]> {\n\tconst cacheKey = \"explorers\";\n\tconst cachedData = cache.get(cacheKey) as Explorer[];\n\n\tif (cachedData) {\n\t\treturn cachedData;\n\t}\n\n\tconst query = `\n query ExplorersList($offset: Int!, $limit: Int!) {\n explorers(offset: $offset, limit: $limit) {\n id\n baseUrl\n explorer\n hidden\n }\n }\n `;\n\n\tconst { data } = await api.post<{ data: { explorers: Explorer[] } }>(\"\", {\n\t\tquery,\n\t\tvariables: {\n\t\t\toffset: 0,\n\t\t\tlimit: 30,\n\t\t},\n\t});\n\n\tconst explorers = data.data.explorers;\n\tcache.set(cacheKey, explorers);\n\n\treturn explorers;\n}\n\n// ===============================\n// Types\n// ===============================\n\ninterface Explorer {\n\tid: string;\n\tbaseUrl: string;\n\texplorer: string;\n\thidden: boolean;\n}\n","import { z } from \"zod\";\n\nimport {\n\tMAX_MEDIA_COUNT,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n} from \"../data/constants\";\nimport {\n\ttransformAndFilterMetadata,\n\tcontainsOnlyVerifiedLinks,\n\thasAtLeastOneReference,\n\thasMinimumWordCount,\n\tisEventWikiValid,\n\tisMediaContentAndCountValid,\n\ttransformAndFilterTags,\n} from \"../lib/wiki-helpers\";\n\n/**\n * ========================\n * ===== Enum Schemas =====\n * ========================\n */\nexport const MediaType = z.enum([\"GALLERY\", \"ICON\"]);\nexport type MediaType = z.infer<typeof MediaType>;\n\nexport const MediaSource = z.enum([\"IPFS_IMG\", \"VIMEO\", \"YOUTUBE\", \"IPFS_VID\"]);\nexport type MediaSource = z.infer<typeof MediaSource>;\n\nexport const CommonMetaIds = z.enum([\n\t\"references\",\n\t\"website\",\n\t\"contract_url\",\n\t\"location\",\n\t\"email_url\",\n\t\"facebook_profile\",\n\t\"instagram_profile\",\n\t\"twitter_profile\",\n\t\"linkedin_profile\",\n\t\"youtube_profile\",\n\t\"discord_profile\",\n\t\"reddit_profile\",\n\t\"telegram_profile\",\n\t\"github_profile\",\n\t\"coinmarketcap_url\",\n\t\"coingecko_profile\",\n\t\"opensea_profile\",\n\t\"medium_profile\",\n\t\"mirror_profile\",\n\t\"tiktok_profile\",\n\t\"explorer_injective_profile\",\n]);\nexport type CommonMetaIds = z.infer<typeof CommonMetaIds>;\n\nexport const EditSpecificMetaIds = z.enum([\"previous_cid\", \"commit-message\"]);\nexport type EditSpecificMetaIds = z.infer<typeof EditSpecificMetaIds>;\n\nexport const ValidatorCodes = z.enum([\n\t\"VALID_WIKI\",\n\t\"ID_ERROR\",\n\t\"LANGUAGE_ERROR\",\n\t\"USER_ERROR\",\n\t\"WORD_COUNT_ERROR\",\n\t\"CATEGORY_ERROR\",\n\t\"SUMMARY_ERROR\",\n\t\"IMAGE_ERROR\",\n\t\"TAG_ERROR\",\n\t\"EXTERNAL_URL_ERROR\",\n\t\"METADATA_ERROR\",\n\t\"MEDIA_ERROR\",\n\t\"GLOBAL_RATE_LIMIT\",\n\t\"LINKED_WIKIS\",\n\t\"EVENTS_ERROR\",\n]);\nexport type ValidatorCodes = z.infer<typeof ValidatorCodes>;\n\nexport const LanguagesISO = z.enum([\"en\", \"es\", \"zh\", \"ko\"]);\nexport type LanguagesISO = z.infer<typeof LanguagesISO>;\n\nexport const LinkedWikiKey = z.enum([\"founders\", \"blockchains\", \"speakers\"]);\nexport type LinkedWikiKey = z.infer<typeof LinkedWikiKey>;\n\nexport const EventType = z.enum([\"CREATED\", \"DEFAULT\", \"MULTIDATE\"]);\nexport type EventType = z.infer<typeof EventType>;\n\nexport const Tag = z.enum([\n\t\"Artists\",\n\t\"AI\",\n\t\"BinanceSmartChain\",\n\t\"Blockchains\",\n\t\"CEXes\",\n\t\"Collections\",\n\t\"Collectors\",\n\t\"Conference\",\n\t\"DEXes\",\n\t\"Developers\",\n\t\"Entertainment\",\n\t\"Ethereum\",\n\t\"Events\",\n\t\"Forum\",\n\t\"Founders\",\n\t\"Festival\",\n\t\"Games\",\n\t\"Glossary\",\n\t\"Hackathon\",\n\t\"Marketplaces\",\n\t\"Memecoins\",\n\t\"Organizations\",\n\t\"Online\",\n\t\"PeopleInDeFi\",\n\t\"Polkadot\",\n\t\"Polygon\",\n\t\"Protocols\",\n\t\"Solana\",\n\t\"Speakers\",\n\t\"Stablecoins\",\n\t\"Venture\",\n]);\nexport type Tag = z.infer<typeof Tag>;\n\nexport const Category = z.enum([\n\t\"nfts\",\n\t\"defi\",\n\t\"exchanges\",\n\t\"cryptocurrencies\",\n\t\"daos\",\n\t\"people\",\n\t\"dapps\",\n\t\"organizations\",\n]);\nexport type Category = z.infer<typeof Category>;\n\n/**\n * ==============================\n * ===== Supporting Schemas =====\n * ==============================\n */\n\nexport const ProfileLinks = z.object({\n\ttwitter: z.string().nullable(),\n\twebsite: z.string().nullable(),\n\tinstagram: z.string().nullable(),\n});\nexport type ProfileLinks = z.infer<typeof ProfileLinks>;\n\nexport const ProfileData = z.object({\n\tid: z.string().nullable(),\n\tusername: z.string().nullable(),\n\tbio: z.string().nullable(),\n\tlinks: z.array(ProfileLinks).nullable(),\n\tbanner: z.string().nullable(),\n\tavatar: z.string().nullable(),\n});\nexport type ProfileData = z.infer<typeof ProfileData>;\n\nexport const Image = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n});\nexport type Image = z.infer<typeof Image>;\n\nexport const Media = z.object({\n\tid: z.string(),\n\tsize: z.union([z.string(), z.number()]).nullish(),\n\tname: z.string().nullish(),\n\ttype: MediaType.nullish(),\n\tcaption: z.string().nullish(),\n\tthumbnail: z.string().nullish(),\n\tsource: MediaSource,\n});\nexport type Media = z.infer<typeof Media>;\n\nconst MetaData = z.object({\n\tid: z.string(),\n\tvalue: z.any(),\n});\nexport type MetaData = z.infer<typeof MetaData>;\n\nexport const BaseCategory = z.object({\n\tid: Category,\n\ttitle: z.string(),\n});\nexport type BaseCategory = z.infer<typeof BaseCategory>;\n\nexport const BaseEvents = z.object({\n\tid: z.string().nullish(),\n\tdate: z.string().nullable(),\n\ttitle: z.string().nullish(),\n\ttype: EventType.nullable(),\n\tdescription: z.string().nullish(),\n\tlink: z.string().nullish(),\n\tmultiDateStart: z.string().nullish(),\n\tmultiDateEnd: z.string().nullish(),\n\tcontinent: z.string().nullish(),\n\tcountry: z.string().nullish(),\n\taction: z.enum([\"DELETE\", \"EDIT\", \"CREATE\"]).nullish(),\n});\nexport type BaseEvents = z.infer<typeof BaseEvents>;\n\n/**\n * ========================\n * ===== Core Schemas =====\n * ========================\n */\n\nexport const Wiki = z\n\t.object({\n\t\tid: z.string(),\n\t\ttitle: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Title at the top for this Wiki to continue\")\n\t\t\t.max(\n\t\t\t\tWIKI_TITLE_MAX_LENGTH,\n\t\t\t\t`Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t\t),\n\t\tcontent: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Content section to continue\")\n\t\t\t.refine(\n\t\t\t\thasMinimumWordCount,\n\t\t\t\t`Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue`,\n\t\t\t)\n\t\t\t.refine(\n\t\t\t\tcontainsOnlyVerifiedLinks,\n\t\t\t\t\"Please remove all external links from the content\",\n\t\t\t),\n\t\tsummary: z\n\t\t\t.string()\n\t\t\t.max(\n\t\t\t\tWIKI_SUMMARY_MAX_LENGTH,\n\t\t\t\t`Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t\t),\n\t\timages: z\n\t\t\t.array(Image)\n\t\t\t.min(1, \"Add a main image on the right column to continue\"),\n\t\tcategories: z.array(BaseCategory).min(1, \"Add one category to continue\"),\n\t\ttags: z\n\t\t\t.array(z.object({ id: z.string() }))\n\t\t\t.transform(transformAndFilterTags),\n\t\tmedia: z\n\t\t\t.array(Media)\n\t\t\t.max(MAX_MEDIA_COUNT)\n\t\t\t.refine(isMediaContentAndCountValid, \"Media is invalid\")\n\t\t\t.optional(),\n\t\tmetadata: z\n\t\t\t.array(MetaData)\n\t\t\t.refine(hasAtLeastOneReference, \"Please add at least one citation\")\n\t\t\t.transform(transformAndFilterMetadata),\n\t\tevents: z.array(BaseEvents).nullish(),\n\t\tuser: z.object({ id: z.string() }),\n\t\tauthor: z.object({ id: z.string() }),\n\t\tlanguage: LanguagesISO.default(LanguagesISO.Enum.en),\n\t\tversion: z.number().default(1),\n\t\tlinkedWikis: z\n\t\t\t.object({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: [],\n\t\t\t})\n\t\t\t.transform((val) => ({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]:\n\t\t\t\t\tval?.[LinkedWikiKey.Enum.blockchains] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? [],\n\t\t\t})),\n\t})\n\t.refine(isEventWikiValid, {\n\t\tmessage:\n\t\t\t\"Event wikis must have an event link citation and at least one event date\",\n\t\tpath: [\"events\"],\n\t});\n\nexport type Wiki = z.infer<typeof Wiki>;\n\nexport const Reference = z.object({\n\tid: z.string(),\n\tdescription: z.string(),\n\ttimestamp: z.number(),\n\turl: z.string(),\n});\nexport type Reference = z.infer<typeof Reference>;\n","import {\n\tCITATIONS_SCORE_WEIGHT,\n\tCONTENT_SCORE_WEIGHT,\n\tGOOD_CONTENT_WORD_COUNT,\n\tIDEAL_CITATIONS_COUNT,\n\tIDEAL_CONTENT_WORD_COUNT,\n\tIDEAL_INTERNAL_LINKS_COUNT,\n\tIDEAL_MEDIA_COUNT,\n\tIDEAL_SOCIAL_MEDIA_COUNT,\n\tIDEAL_SUMMARY_LENGTH,\n\tIDEAL_TAGS_COUNT,\n\tINTERNAL_LINKS_SCORE_WEIGHT,\n\tMEDIA_SCORE_WEIGHT,\n\tMIN_CONTENT_WORD_COUNT,\n\tSOCIAL_SCORE_WEIGHT,\n\tSUMMARY_SCORE_WEIGHT,\n\tTAGS_SCORE_WEIGHT,\n} from \"../data/constants\";\nimport { CommonMetaIds, type Wiki } from \"../schema\";\n\nconst contentQuality = (wordCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tlet score = 0;\n\n\tif (wordCount < MIN_CONTENT_WORD_COUNT) {\n\t\treturn scoreMin;\n\t}\n\n\tif (\n\t\twordCount >= MIN_CONTENT_WORD_COUNT &&\n\t\twordCount <= GOOD_CONTENT_WORD_COUNT\n\t) {\n\t\tscore = wordCount / GOOD_CONTENT_WORD_COUNT;\n\t\tscore *= 0.8;\n\t}\n\n\tif (\n\t\twordCount > GOOD_CONTENT_WORD_COUNT &&\n\t\twordCount < IDEAL_CONTENT_WORD_COUNT\n\t) {\n\t\tconst baseScore = 0.8;\n\t\tconst wordCountAboveGood = wordCount - GOOD_CONTENT_WORD_COUNT;\n\t\tconst extraScoreFactor =\n\t\t\twordCountAboveGood / (IDEAL_CONTENT_WORD_COUNT - GOOD_CONTENT_WORD_COUNT);\n\t\tconst extraScore = Math.sqrt(extraScoreFactor) * 0.2;\n\t\tscore = baseScore + extraScore;\n\t}\n\n\tif (wordCount >= IDEAL_CONTENT_WORD_COUNT) {\n\t\treturn scoreMax;\n\t}\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst countQuality = (idealCount: number, realCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tconst score = realCount / idealCount;\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst getHostnameFromRegex = (url: string) => {\n\tconst matches = RegExp(/^https?:\\/\\/([^/?#]+)(?:[/?#]|$)/i).exec(url);\n\treturn matches?.[1];\n};\n\nconst getWikiInternalLinks = (content: string): number => {\n\tconst markdownLinkRegex = /\\[(.*?)\\]\\((.*?)\\)/g;\n\tlet internalLinksCount = 0;\n\tlet match = markdownLinkRegex.exec(content);\n\n\twhile (match !== null) {\n\t\tconst url = match[2];\n\t\tif (url && !url.startsWith(\"#\")) {\n\t\t\tconst hostname = getHostnameFromRegex(url);\n\t\t\tif (\n\t\t\t\thostname === \"everipedia.org\" ||\n\t\t\t\thostname === \"iq.wiki\" ||\n\t\t\t\thostname?.endsWith(\".everipedia.org\")\n\t\t\t) {\n\t\t\t\tinternalLinksCount++;\n\t\t\t}\n\t\t}\n\t\tmatch = markdownLinkRegex.exec(content); // Move assignment here\n\t}\n\n\treturn internalLinksCount;\n};\n\nconst getWikiCitationLinks = (wiki: Wiki) => {\n\tconst rawWikiReferences = wiki.metadata.find(\n\t\t(m) => m.id === CommonMetaIds.Enum.references,\n\t)?.value;\n\n\tif (\n\t\trawWikiReferences === undefined ||\n\t\trawWikiReferences?.trim().length === 0\n\t) {\n\t\treturn 0;\n\t}\n\n\tconst wikiReferences = JSON.parse(rawWikiReferences);\n\n\treturn wikiReferences.length;\n};\n\nconst getSocialsCount = (wiki: Wiki): number => {\n\tlet socialsCount = 0;\n\tfor (const meta of wiki.metadata) {\n\t\tif (\n\t\t\tCommonMetaIds.options.includes(meta.id as keyof typeof CommonMetaIds.enum)\n\t\t) {\n\t\t\tif (meta.value) {\n\t\t\t\tsocialsCount += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn socialsCount;\n};\n\nexport const calculateWikiScore = (wiki: Wiki): number => {\n\tconst wordCount = wiki.content.split(\" \").length;\n\tconst internalLinksCount = getWikiInternalLinks(wiki.content);\n\tconst citationCount = getWikiCitationLinks(wiki);\n\tconst mediaCount = wiki.media?.length || 0;\n\tconst tagsCount = wiki.tags?.length || 0;\n\tconst summaryWordCount = wiki.summary?.length || 0;\n\tconst socialsCount = getSocialsCount(wiki);\n\n\tconst contentScore = contentQuality(wordCount);\n\tconst internalLinksScore = countQuality(\n\t\tIDEAL_INTERNAL_LINKS_COUNT,\n\t\tinternalLinksCount,\n\t);\n\tconst citationScore = countQuality(IDEAL_CITATIONS_COUNT, citationCount);\n\tconst mediaScore = countQuality(IDEAL_MEDIA_COUNT, mediaCount);\n\tconst tagsScore = countQuality(IDEAL_TAGS_COUNT, tagsCount);\n\tconst summaryScore = countQuality(IDEAL_SUMMARY_LENGTH, summaryWordCount);\n\tconst socialsScore = countQuality(IDEAL_SOCIAL_MEDIA_COUNT, socialsCount);\n\n\tconst sumOfWeights =\n\t\tCONTENT_SCORE_WEIGHT +\n\t\tINTERNAL_LINKS_SCORE_WEIGHT +\n\t\tCITATIONS_SCORE_WEIGHT +\n\t\tMEDIA_SCORE_WEIGHT +\n\t\tTAGS_SCORE_WEIGHT +\n\t\tSUMMARY_SCORE_WEIGHT +\n\t\tSOCIAL_SCORE_WEIGHT;\n\n\tconst score =\n\t\t(contentScore * CONTENT_SCORE_WEIGHT +\n\t\t\tinternalLinksScore * INTERNAL_LINKS_SCORE_WEIGHT +\n\t\t\tcitationScore * CITATIONS_SCORE_WEIGHT +\n\t\t\tmediaScore * MEDIA_SCORE_WEIGHT +\n\t\t\ttagsScore * TAGS_SCORE_WEIGHT +\n\t\t\tsummaryScore * SUMMARY_SCORE_WEIGHT +\n\t\t\tsocialsScore * SOCIAL_SCORE_WEIGHT) /\n\t\tsumOfWeights;\n\n\tconst percentScore = Math.floor(score * 100);\n\treturn percentScore;\n};\n","import {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tMEDIA_UPLOAD_PENDING_SUFFIX,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n} from \"../data/constants\";\nimport { CommonMetaIds, MediaSource, MediaType, type Wiki } from \"../schema\";\n\n/**\n * Counts the number of words in a given string.\n * @param text - The input string to count words from.\n * @returns The number of words in the string.\n */\nexport const countWords = (text: string) =>\n\ttext.split(\" \").filter((word) => word !== \"\").length;\n\n/**\n * Checks if a given string is a valid URL.\n * @param urlString - The string to check.\n * @returns True if the string is a valid URL, false otherwise.\n */\nexport const isValidUrl = (urlString: string) => {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n};\n\n/**\n * Checks if all content links in the given text are verified.\n * @param content - The content to check for links.\n * @returns True if all links are verified, false otherwise.\n */\nexport const areContentLinksVerified = (content: string) => {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n};\n\n/**\n * Checks if the media in the wiki is valid.\n * @param wiki - The wiki object to check.\n * @returns True if the media is valid, false otherwise.\n */\nexport const isMediaValid = (wiki: Wiki) => {\n\tif (!wiki.media) return true;\n\n\tconst isMediaContentValid = wiki.media.every((media) => {\n\t\tif (\n\t\t\tmedia.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\tmedia.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn media.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*).*/;\n\t\t\treturn (\n\t\t\t\tmedia.id === `https://www.youtube.com/watch?v=${media.name}` &&\n\t\t\t\tyoutubePattern.test(media.id)\n\t\t\t);\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn media.id === `https://vimeo.com/${media.name}`;\n\t\t}\n\n\t\treturn media.type ? MediaType.options.includes(media.type) : true;\n\t});\n\n\tconst iconMediaCount = wiki.media.filter(\n\t\t(media) => media.type === MediaType.Enum.ICON,\n\t).length;\n\n\treturn (\n\t\twiki.media.length <= MAX_MEDIA_COUNT &&\n\t\tisMediaContentValid &&\n\t\ticonMediaCount <= 1\n\t);\n};\n\n/**\n * Checks if any media in the wiki is still uploading.\n * @param wiki - The wiki object to check.\n * @returns True if any media is still uploading, false otherwise.\n */\nexport const isAnyMediaUploading = (wiki: Wiki) =>\n\twiki.media?.some((media) => media.id.endsWith(MEDIA_UPLOAD_PENDING_SUFFIX)) ??\n\tfalse;\n\n/**\n * Checks if the event URL is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event URL is missing, false otherwise.\n */\nexport const isEventUrlMissing = (wiki: Wiki) => {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references = JSON.parse(referencesData);\n\t\treturn !references.some(\n\t\t\t(item: { description: string }) =>\n\t\t\t\titem.description.toLowerCase() === \"event link\",\n\t\t);\n\t}\n\treturn false;\n};\n\n/**\n * Checks if the event date is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event date is missing, false otherwise.\n */\nexport const isEventDateMissing = (wiki: Wiki) =>\n\twiki.tags.some((tag) => tag.id === \"Events\") && wiki.events?.length === 0;\n\n/**\n * Checks if the wiki summary exceeds the maximum length.\n * @param wiki - The wiki object to check.\n * @returns True if the summary exceeds the limit, false otherwise.\n */\nexport const isSummaryTooLong = (wiki: Wiki) =>\n\t!!(wiki.summary && wiki.summary.length > WIKI_SUMMARY_MAX_LENGTH);\n\n/**\n * Checks if the wiki has no citations.\n * @param wiki - The wiki object to check.\n * @returns True if there are no citations, false otherwise.\n */\nexport const hasNoCitations = (wiki: Wiki) => {\n\tconst references = wiki.metadata.find(\n\t\t(meta) => meta.id === CommonMetaIds.Enum.references,\n\t);\n\treturn !references?.value || references.value.length === 0;\n};\n\n/**\n * Validates a wiki object and returns the validation result.\n * @param wiki - The wiki object to validate.\n * @returns An object containing the validation result and an error message if applicable.\n */\nexport const validateWiki = (wiki: Wiki) => {\n\tconst wordCount = countWords(wiki.content || \"\");\n\n\tif (!wiki.title) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a Title at the top for this Wiki to continue\",\n\t\t};\n\t}\n\n\tif (wiki.title.length > WIKI_TITLE_MAX_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t};\n\t}\n\n\tif (!wiki.content) {\n\t\treturn { isValid: false, error: \"Add a Content section to continue\" };\n\t}\n\n\tif (wordCount < WIKI_CONTENT_MIN_WORDS) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue. You have written ${wordCount}`,\n\t\t};\n\t}\n\n\tif (!areContentLinksVerified(wiki.content)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Please remove all external links from the content\",\n\t\t};\n\t}\n\n\tif (!wiki.images?.length) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a main image on the right column to continue\",\n\t\t};\n\t}\n\n\tif (wiki.categories.length === 0) {\n\t\treturn { isValid: false, error: \"Add one category to continue\" };\n\t}\n\n\tif (isSummaryTooLong(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t};\n\t}\n\n\tif (isAnyMediaUploading(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Some media are still uploading, please wait\",\n\t\t};\n\t}\n\n\tif (hasNoCitations(wiki)) {\n\t\treturn { isValid: false, error: \"Please add at least one citation\" };\n\t}\n\n\tif (isEventUrlMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t\"Please cite the event official website with 'Event Link' description\",\n\t\t};\n\t}\n\n\tif (isEventDateMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t'Please open the \"Edit Wiki Details Modal\" and enter a valid event date',\n\t\t};\n\t}\n\n\tif (!isMediaValid(wiki)) {\n\t\treturn { isValid: false, error: \"Media is invalid\" };\n\t}\n\n\treturn { isValid: true };\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/data/constants.ts","../src/lib/wiki-helpers.ts","../src/schema/index.ts","../src/lib/wiki-score.ts","../src/lib/check-wiki-validity.ts","../src/lib/twitter-api-client.ts"],"names":["Wiki","isMediaContentValid"],"mappings":"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","file":"index.mjs","sourcesContent":["export const WIKI_SUMMARY_MAX_LENGTH = 255;\nexport const WIKI_CONTENT_MIN_WORDS = 100;\nexport const WIKI_TITLE_MAX_LENGTH = 60;\nexport const MEDIA_UPLOAD_PENDING_SUFFIX = \"default\";\nexport const MAX_MEDIA_COUNT = 25;\nexport const IPFS_HASH_LENGTH = 46;\nexport const EditorContentOverride = \"%OVERRIDE@EDITOR@MARKDOWN%\";\nexport const CreateNewWikiSlug = \"/*CREATE+NEW+WIKI*/\";\n\nexport const MIN_CONTENT_WORD_COUNT = 10;\nexport const GOOD_CONTENT_WORD_COUNT = 500;\nexport const IDEAL_CONTENT_WORD_COUNT = 1500;\n\nexport const CONTENT_SCORE_WEIGHT = 0.8;\nexport const INTERNAL_LINKS_SCORE_WEIGHT = 0.5;\nexport const CITATIONS_SCORE_WEIGHT = 0.5;\nexport const MEDIA_SCORE_WEIGHT = 0.3;\nexport const TAGS_SCORE_WEIGHT = 0.3;\nexport const SUMMARY_SCORE_WEIGHT = 0.5;\nexport const SOCIAL_SCORE_WEIGHT = 0.5;\n\nexport const IDEAL_INTERNAL_LINKS_COUNT = 10;\nexport const IDEAL_CITATIONS_COUNT = 10;\nexport const IDEAL_MEDIA_COUNT = 5;\nexport const IDEAL_TAGS_COUNT = 3;\nexport const IDEAL_SUMMARY_LENGTH = 100;\nexport const IDEAL_SOCIAL_MEDIA_COUNT = 4;\n\nexport const WHITELISTED_DOMAINS = [\n\t\"youtube.com/watch\",\n\t\"youtu.be\",\n\t\"vimeo.com\",\n\t\"alpha.everipedia.org/wiki\",\n\t\"beta.everipedia.org/wiki\",\n\t\"iq.wiki/wiki\",\n\t\"ipfs.everipedia.org/ipfs\",\n];\n\nexport const WHITELISTED_LINK_NAMES = [\"YOUTUBE@VID\", \"DUNE@EMBED\"];\n","import axios from \"axios\";\nimport QuickLRU from \"quick-lru\";\nimport {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n\tWIKI_CONTENT_MIN_WORDS,\n} from \"../data/constants\";\nimport {\n\tCommonMetaIds,\n\tEditSpecificMetaIds,\n\ttype Media,\n\tMediaSource,\n\tMediaType,\n\ttype MetaData,\n\tTag,\n\tWiki,\n} from \"../schema\";\n\n// ===============================\n// Text and content helpers\n// ===============================\n\n/**\n * Counts the number of words in a given string.\n * @param text - The input string to count words from.\n * @returns The number of words in the string.\n */\nexport function countWords(text: string): number {\n\treturn text.split(\" \").filter((word) => word !== \"\").length;\n}\n\n/**\n * Checks if a given string is a valid URL.\n * @param urlString - The string to check.\n * @returns True if the string is a valid URL, false otherwise.\n */\nexport const isValidUrl = (urlString: string) => {\n\ttry {\n\t\treturn Boolean(new URL(urlString));\n\t} catch (_e) {\n\t\treturn false;\n\t}\n};\n\nexport function containsOnlyVerifiedLinks(content: string): boolean {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n}\n\n// ===============================\n// Media validation helpers\n// ===============================\nexport function isMediaContentValid(media: Media[]): boolean {\n\treturn media.every((item) => {\n\t\tif (\n\t\t\titem.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\titem.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn item.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*)(?:\\?si=[^#&?]*)?(?:\\?v=[^#&?]*)?(?:[#&].*)?$/;\n\t\t\treturn (\n\t\t\t\titem.id === `https://www.youtube.com/watch?v=${item.name}` &&\n\t\t\t\tyoutubePattern.test(item.id)\n\t\t\t);\n\t\t}\n\n\t\tif (item.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn item.id === `https://vimeo.com/${item.name}`;\n\t\t}\n\n\t\treturn item.type ? item.type in MediaType : true;\n\t});\n}\n\nexport function isMediaCountWithinLimits(media: Media[]): boolean {\n\tconst iconMediaCount = media.filter(\n\t\t(item) => item.type === MediaType.Enum.ICON,\n\t).length;\n\treturn media.length <= MAX_MEDIA_COUNT && iconMediaCount <= 1;\n}\n\nexport function isMediaContentAndCountValid(media: Media[]): boolean {\n\treturn isMediaContentValid(media) && isMediaCountWithinLimits(media);\n}\n\n// ===============================\n// Wiki-specific validation helpers\n// ===============================\nexport function isEventWikiValid(wiki: {\n\ttags: { id: string }[];\n\tmetadata: { id: string; value: string }[];\n\tevents: unknown[];\n}): boolean {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references: { description: string }[] = JSON.parse(\n\t\t\treferencesData,\n\t\t) as { description: string }[];\n\t\tconst hasEventLink = references.some(\n\t\t\t(item) => item.description.toLowerCase() === \"event link\",\n\t\t);\n\t\treturn hasEventLink && Array.isArray(wiki.events) && wiki.events.length > 0;\n\t}\n\treturn true;\n}\n\nexport function hasMinimumWordCount(content: string): boolean {\n\treturn countWords(content) >= WIKI_CONTENT_MIN_WORDS;\n}\n\n// ===============================\n// Metadata helpers\n// ===============================\nexport function hasAtLeastOneReference(metadata: MetaData[]): boolean {\n\tconst referencesData =\n\t\tmetadata.find((meta) => meta.id === CommonMetaIds.Enum.references)?.value ||\n\t\t\"[]\";\n\tconst references = JSON.parse(referencesData) as { description: string }[];\n\treturn references.length > 0;\n}\n\nexport async function transformAndFilterMetadata(\n\tmetadata: MetaData[],\n): Promise<MetaData[]> {\n\tconst explorers = await getExplorers();\n\tconst validIds = new Set([\n\t\t...CommonMetaIds.options,\n\t\t...EditSpecificMetaIds.options,\n\t\t...explorers.map((e) => e.id),\n\t]);\n\n\treturn metadata.filter((meta) => {\n\t\tif (!validIds.has(meta.id)) return false;\n\n\t\tconst explorer = explorers.find((e) => e.id === meta.id);\n\t\tif (explorer) {\n\t\t\treturn (\n\t\t\t\tisValidUrl(meta.value) &&\n\t\t\t\tnew URL(meta.value).origin === new URL(explorer.baseUrl).origin\n\t\t\t);\n\t\t}\n\n\t\treturn true;\n\t});\n}\n\n// ===============================\n// Tag helpers\n// ===============================\nexport function transformAndFilterTags(tags: { id: string }[]): { id: Tag }[] {\n\treturn tags\n\t\t.filter((tag) => Tag.safeParse(tag.id).success)\n\t\t.map((tag) => ({ id: tag.id as Tag }));\n}\n\n// ===============================\n// API-related helpers\n// ===============================\n\nconst cache = new QuickLRU({\n\tmaxSize: 1000,\n\tmaxAge: 12 * 60 * 60 * 1000, // 12 hours\n});\n\nexport const api = axios.create({\n\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\theaders: {\n\t\t\"Content-Type\": \"application/json\",\n\t},\n});\n\nexport async function getExplorers(): Promise<Explorer[]> {\n\tconst cacheKey = \"explorers\";\n\tconst cachedData = cache.get(cacheKey) as Explorer[];\n\n\tif (cachedData) {\n\t\treturn cachedData;\n\t}\n\n\tconst query = `\n query ExplorersList($offset: Int!, $limit: Int!) {\n explorers(offset: $offset, limit: $limit) {\n id\n baseUrl\n explorer\n hidden\n }\n }\n `;\n\n\tconst { data } = await api.post<{ data: { explorers: Explorer[] } }>(\"\", {\n\t\tquery,\n\t\tvariables: {\n\t\t\toffset: 0,\n\t\t\tlimit: 30,\n\t\t},\n\t});\n\n\tconst explorers = data.data.explorers;\n\tcache.set(cacheKey, explorers);\n\n\treturn explorers;\n}\n\n// ===============================\n// Types\n// ===============================\n\ninterface Explorer {\n\tid: string;\n\tbaseUrl: string;\n\texplorer: string;\n\thidden: boolean;\n}\n","import { z } from \"zod\";\n\nimport {\n\tMAX_MEDIA_COUNT,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n} from \"../data/constants\";\nimport {\n\ttransformAndFilterMetadata,\n\tcontainsOnlyVerifiedLinks,\n\thasAtLeastOneReference,\n\thasMinimumWordCount,\n\tisEventWikiValid,\n\tisMediaContentAndCountValid,\n\ttransformAndFilterTags,\n} from \"../lib/wiki-helpers\";\n\n/**\n * ========================\n * ===== Enum Schemas =====\n * ========================\n */\nexport const MediaType = z.enum([\"GALLERY\", \"ICON\"]);\nexport type MediaType = z.infer<typeof MediaType>;\n\nexport const MediaSource = z.enum([\"IPFS_IMG\", \"VIMEO\", \"YOUTUBE\", \"IPFS_VID\"]);\nexport type MediaSource = z.infer<typeof MediaSource>;\n\nexport const CommonMetaIds = z.enum([\n\t\"references\",\n\t\"website\",\n\t\"contract_url\",\n\t\"location\",\n\t\"email_url\",\n\t\"facebook_profile\",\n\t\"instagram_profile\",\n\t\"twitter_profile\",\n\t\"linkedin_profile\",\n\t\"youtube_profile\",\n\t\"discord_profile\",\n\t\"reddit_profile\",\n\t\"telegram_profile\",\n\t\"github_profile\",\n\t\"coinmarketcap_url\",\n\t\"coingecko_profile\",\n\t\"opensea_profile\",\n\t\"medium_profile\",\n\t\"mirror_profile\",\n\t\"tiktok_profile\",\n\t\"explorer_injective_profile\",\n]);\nexport type CommonMetaIds = z.infer<typeof CommonMetaIds>;\n\nexport const EditSpecificMetaIds = z.enum([\"previous_cid\", \"commit-message\"]);\nexport type EditSpecificMetaIds = z.infer<typeof EditSpecificMetaIds>;\n\nexport const ValidatorCodes = z.enum([\n\t\"VALID_WIKI\",\n\t\"ID_ERROR\",\n\t\"LANGUAGE_ERROR\",\n\t\"USER_ERROR\",\n\t\"WORD_COUNT_ERROR\",\n\t\"CATEGORY_ERROR\",\n\t\"SUMMARY_ERROR\",\n\t\"IMAGE_ERROR\",\n\t\"TAG_ERROR\",\n\t\"EXTERNAL_URL_ERROR\",\n\t\"METADATA_ERROR\",\n\t\"MEDIA_ERROR\",\n\t\"GLOBAL_RATE_LIMIT\",\n\t\"LINKED_WIKIS\",\n\t\"EVENTS_ERROR\",\n]);\nexport type ValidatorCodes = z.infer<typeof ValidatorCodes>;\n\nexport const LanguagesISO = z.enum([\"en\", \"es\", \"zh\", \"ko\"]);\nexport type LanguagesISO = z.infer<typeof LanguagesISO>;\n\nexport const LinkedWikiKey = z.enum([\"founders\", \"blockchains\", \"speakers\"]);\nexport type LinkedWikiKey = z.infer<typeof LinkedWikiKey>;\n\nexport const EventType = z.enum([\"CREATED\", \"DEFAULT\", \"MULTIDATE\"]);\nexport type EventType = z.infer<typeof EventType>;\n\nexport const Tag = z.enum([\n\t\"Artists\",\n\t\"AI\",\n\t\"BinanceSmartChain\",\n\t\"Blockchains\",\n\t\"CEXes\",\n\t\"Collections\",\n\t\"Collectors\",\n\t\"Conference\",\n\t\"DEXes\",\n\t\"Developers\",\n\t\"Entertainment\",\n\t\"Ethereum\",\n\t\"Events\",\n\t\"Forum\",\n\t\"Founders\",\n\t\"Festival\",\n\t\"Games\",\n\t\"Glossary\",\n\t\"Hackathon\",\n\t\"Marketplaces\",\n\t\"Memecoins\",\n\t\"Organizations\",\n\t\"Online\",\n\t\"PeopleInDeFi\",\n\t\"Polkadot\",\n\t\"Polygon\",\n\t\"Protocols\",\n\t\"Solana\",\n\t\"Speakers\",\n\t\"Stablecoins\",\n\t\"Venture\",\n]);\nexport type Tag = z.infer<typeof Tag>;\n\nexport const Category = z.enum([\n\t\"nfts\",\n\t\"defi\",\n\t\"exchanges\",\n\t\"cryptocurrencies\",\n\t\"daos\",\n\t\"people\",\n\t\"dapps\",\n\t\"organizations\",\n]);\nexport type Category = z.infer<typeof Category>;\n\n/**\n * ==============================\n * ===== Supporting Schemas =====\n * ==============================\n */\n\nexport const ProfileLinks = z.object({\n\ttwitter: z.string().nullable(),\n\twebsite: z.string().nullable(),\n\tinstagram: z.string().nullable(),\n});\nexport type ProfileLinks = z.infer<typeof ProfileLinks>;\n\nexport const ProfileData = z.object({\n\tid: z.string().nullable(),\n\tusername: z.string().nullable(),\n\tbio: z.string().nullable(),\n\tlinks: z.array(ProfileLinks).nullable(),\n\tbanner: z.string().nullable(),\n\tavatar: z.string().nullable(),\n});\nexport type ProfileData = z.infer<typeof ProfileData>;\n\nexport const Image = z.object({\n\tid: z.string(),\n\ttype: z.string(),\n});\nexport type Image = z.infer<typeof Image>;\n\nexport const Media = z.object({\n\tid: z.string(),\n\tsize: z.union([z.string(), z.number()]).nullish(),\n\tname: z.string().nullish(),\n\ttype: MediaType.nullish(),\n\tcaption: z.string().nullish(),\n\tthumbnail: z.string().nullish(),\n\tsource: MediaSource,\n});\nexport type Media = z.infer<typeof Media>;\n\nconst MetaData = z.object({\n\tid: z.string(),\n\tvalue: z.any(),\n});\nexport type MetaData = z.infer<typeof MetaData>;\n\nexport const BaseCategory = z.object({\n\tid: Category,\n\ttitle: z.string(),\n});\nexport type BaseCategory = z.infer<typeof BaseCategory>;\n\nexport const BaseEvents = z.object({\n\tid: z.string().nullish(),\n\tdate: z.string().nullable(),\n\ttitle: z.string().nullish(),\n\ttype: EventType.nullable(),\n\tdescription: z.string().nullish(),\n\tlink: z.string().nullish(),\n\tmultiDateStart: z.string().nullish(),\n\tmultiDateEnd: z.string().nullish(),\n\tcontinent: z.string().nullish(),\n\tcountry: z.string().nullish(),\n\taction: z.enum([\"DELETE\", \"EDIT\", \"CREATE\"]).nullish(),\n});\nexport type BaseEvents = z.infer<typeof BaseEvents>;\n\n/**\n * ========================\n * ===== Core Schemas =====\n * ========================\n */\n\nexport const Wiki = z\n\t.object({\n\t\tid: z.string(),\n\t\ttitle: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Title at the top for this Wiki to continue\")\n\t\t\t.max(\n\t\t\t\tWIKI_TITLE_MAX_LENGTH,\n\t\t\t\t`Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t\t),\n\t\tcontent: z\n\t\t\t.string()\n\t\t\t.min(1, \"Add a Content section to continue\")\n\t\t\t.refine(\n\t\t\t\thasMinimumWordCount,\n\t\t\t\t`Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue`,\n\t\t\t)\n\t\t\t.refine(\n\t\t\t\tcontainsOnlyVerifiedLinks,\n\t\t\t\t\"Please remove all external links from the content\",\n\t\t\t),\n\t\tsummary: z\n\t\t\t.string()\n\t\t\t.max(\n\t\t\t\tWIKI_SUMMARY_MAX_LENGTH,\n\t\t\t\t`Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t\t),\n\t\timages: z\n\t\t\t.array(Image)\n\t\t\t.min(1, \"Add a main image on the right column to continue\"),\n\t\tcategories: z.array(BaseCategory).min(1, \"Add one category to continue\"),\n\t\ttags: z\n\t\t\t.array(z.object({ id: z.string() }))\n\t\t\t.transform(transformAndFilterTags),\n\t\tmedia: z\n\t\t\t.array(Media)\n\t\t\t.max(MAX_MEDIA_COUNT)\n\t\t\t.refine(isMediaContentAndCountValid, \"Media is invalid\")\n\t\t\t.optional(),\n\t\tmetadata: z\n\t\t\t.array(MetaData)\n\t\t\t.refine(hasAtLeastOneReference, \"Please add at least one citation\")\n\t\t\t.transform(transformAndFilterMetadata),\n\t\tevents: z.array(BaseEvents).nullish(),\n\t\tuser: z.object({ id: z.string() }),\n\t\tauthor: z.object({ id: z.string() }),\n\t\tlanguage: LanguagesISO.default(LanguagesISO.Enum.en),\n\t\tversion: z.number().default(1),\n\t\tlinkedWikis: z\n\t\t\t.object({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z\n\t\t\t\t\t.array(z.string())\n\t\t\t\t\t.nullish()\n\t\t\t\t\t.default([]),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]: [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: [],\n\t\t\t})\n\t\t\t.transform((val) => ({\n\t\t\t\t[LinkedWikiKey.Enum.blockchains]:\n\t\t\t\t\tval?.[LinkedWikiKey.Enum.blockchains] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.founders]: val?.[LinkedWikiKey.Enum.founders] ?? [],\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: val?.[LinkedWikiKey.Enum.speakers] ?? [],\n\t\t\t})),\n\t})\n\t.refine(\n\t\t(arg) =>\n\t\t\tisEventWikiValid(\n\t\t\t\targ as {\n\t\t\t\t\ttags: { id: string }[];\n\t\t\t\t\tmetadata: { id: string; value: string }[];\n\t\t\t\t\tevents: unknown[];\n\t\t\t\t},\n\t\t\t),\n\t\t{\n\t\t\tmessage:\n\t\t\t\t\"Event wikis must have an event link citation and at least one event date\",\n\t\t\tpath: [\"events\"],\n\t\t},\n\t);\nexport type Wiki = z.infer<typeof Wiki>;\n\nexport const Reference = z.object({\n\tid: z.string(),\n\tdescription: z.string(),\n\ttimestamp: z.number(),\n\turl: z.string(),\n});\nexport type Reference = z.infer<typeof Reference>;\n","import {\n\tCITATIONS_SCORE_WEIGHT,\n\tCONTENT_SCORE_WEIGHT,\n\tGOOD_CONTENT_WORD_COUNT,\n\tIDEAL_CITATIONS_COUNT,\n\tIDEAL_CONTENT_WORD_COUNT,\n\tIDEAL_INTERNAL_LINKS_COUNT,\n\tIDEAL_MEDIA_COUNT,\n\tIDEAL_SOCIAL_MEDIA_COUNT,\n\tIDEAL_SUMMARY_LENGTH,\n\tIDEAL_TAGS_COUNT,\n\tINTERNAL_LINKS_SCORE_WEIGHT,\n\tMEDIA_SCORE_WEIGHT,\n\tMIN_CONTENT_WORD_COUNT,\n\tSOCIAL_SCORE_WEIGHT,\n\tSUMMARY_SCORE_WEIGHT,\n\tTAGS_SCORE_WEIGHT,\n} from \"../data/constants\";\nimport { CommonMetaIds, type Wiki } from \"../schema\";\n\nconst contentQuality = (wordCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tlet score = 0;\n\n\tif (wordCount < MIN_CONTENT_WORD_COUNT) {\n\t\treturn scoreMin;\n\t}\n\n\tif (\n\t\twordCount >= MIN_CONTENT_WORD_COUNT &&\n\t\twordCount <= GOOD_CONTENT_WORD_COUNT\n\t) {\n\t\tscore = wordCount / GOOD_CONTENT_WORD_COUNT;\n\t\tscore *= 0.8;\n\t}\n\n\tif (\n\t\twordCount > GOOD_CONTENT_WORD_COUNT &&\n\t\twordCount < IDEAL_CONTENT_WORD_COUNT\n\t) {\n\t\tconst baseScore = 0.8;\n\t\tconst wordCountAboveGood = wordCount - GOOD_CONTENT_WORD_COUNT;\n\t\tconst extraScoreFactor =\n\t\t\twordCountAboveGood / (IDEAL_CONTENT_WORD_COUNT - GOOD_CONTENT_WORD_COUNT);\n\t\tconst extraScore = Math.sqrt(extraScoreFactor) * 0.2;\n\t\tscore = baseScore + extraScore;\n\t}\n\n\tif (wordCount >= IDEAL_CONTENT_WORD_COUNT) {\n\t\treturn scoreMax;\n\t}\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst countQuality = (idealCount: number, realCount: number): number => {\n\tconst scoreMin = 0.0;\n\tconst scoreMax = 1.0;\n\n\tconst score = realCount / idealCount;\n\n\tif (score < scoreMin) {\n\t\treturn scoreMin;\n\t}\n\n\tif (score > scoreMax) {\n\t\treturn scoreMax;\n\t}\n\n\treturn score;\n};\n\nconst getHostnameFromRegex = (url: string) => {\n\tconst matches = RegExp(/^https?:\\/\\/([^/?#]+)(?:[/?#]|$)/i).exec(url);\n\treturn matches?.[1];\n};\n\nconst getWikiInternalLinks = (content: string): number => {\n\tconst markdownLinkRegex = /\\[(.*?)\\]\\((.*?)\\)/g;\n\tlet internalLinksCount = 0;\n\tlet match = markdownLinkRegex.exec(content);\n\n\twhile (match !== null) {\n\t\tconst url = match[2];\n\t\tif (url && !url.startsWith(\"#\")) {\n\t\t\tconst hostname = getHostnameFromRegex(url);\n\t\t\tif (\n\t\t\t\thostname === \"everipedia.org\" ||\n\t\t\t\thostname === \"iq.wiki\" ||\n\t\t\t\thostname?.endsWith(\".everipedia.org\")\n\t\t\t) {\n\t\t\t\tinternalLinksCount++;\n\t\t\t}\n\t\t}\n\t\tmatch = markdownLinkRegex.exec(content); // Move assignment here\n\t}\n\n\treturn internalLinksCount;\n};\n\nconst getWikiCitationLinks = (wiki: Wiki) => {\n\tconst rawWikiReferences = wiki.metadata.find(\n\t\t(m) => m.id === CommonMetaIds.Enum.references,\n\t)?.value;\n\n\tif (\n\t\trawWikiReferences === undefined ||\n\t\trawWikiReferences?.trim().length === 0\n\t) {\n\t\treturn 0;\n\t}\n\n\tconst wikiReferences = JSON.parse(rawWikiReferences);\n\n\treturn wikiReferences.length;\n};\n\nconst getSocialsCount = (wiki: Wiki): number => {\n\tlet socialsCount = 0;\n\tfor (const meta of wiki.metadata) {\n\t\tif (\n\t\t\tCommonMetaIds.options.includes(meta.id as keyof typeof CommonMetaIds.enum)\n\t\t) {\n\t\t\tif (meta.value) {\n\t\t\t\tsocialsCount += 1;\n\t\t\t}\n\t\t}\n\t}\n\treturn socialsCount;\n};\n\nexport const calculateWikiScore = (wiki: Wiki): number => {\n\tconst wordCount = wiki.content.split(\" \").length;\n\tconst internalLinksCount = getWikiInternalLinks(wiki.content);\n\tconst citationCount = getWikiCitationLinks(wiki);\n\tconst mediaCount = wiki.media?.length || 0;\n\tconst tagsCount = wiki.tags?.length || 0;\n\tconst summaryWordCount = wiki.summary?.length || 0;\n\tconst socialsCount = getSocialsCount(wiki);\n\n\tconst contentScore = contentQuality(wordCount);\n\tconst internalLinksScore = countQuality(\n\t\tIDEAL_INTERNAL_LINKS_COUNT,\n\t\tinternalLinksCount,\n\t);\n\tconst citationScore = countQuality(IDEAL_CITATIONS_COUNT, citationCount);\n\tconst mediaScore = countQuality(IDEAL_MEDIA_COUNT, mediaCount);\n\tconst tagsScore = countQuality(IDEAL_TAGS_COUNT, tagsCount);\n\tconst summaryScore = countQuality(IDEAL_SUMMARY_LENGTH, summaryWordCount);\n\tconst socialsScore = countQuality(IDEAL_SOCIAL_MEDIA_COUNT, socialsCount);\n\n\tconst sumOfWeights =\n\t\tCONTENT_SCORE_WEIGHT +\n\t\tINTERNAL_LINKS_SCORE_WEIGHT +\n\t\tCITATIONS_SCORE_WEIGHT +\n\t\tMEDIA_SCORE_WEIGHT +\n\t\tTAGS_SCORE_WEIGHT +\n\t\tSUMMARY_SCORE_WEIGHT +\n\t\tSOCIAL_SCORE_WEIGHT;\n\n\tconst score =\n\t\t(contentScore * CONTENT_SCORE_WEIGHT +\n\t\t\tinternalLinksScore * INTERNAL_LINKS_SCORE_WEIGHT +\n\t\t\tcitationScore * CITATIONS_SCORE_WEIGHT +\n\t\t\tmediaScore * MEDIA_SCORE_WEIGHT +\n\t\t\ttagsScore * TAGS_SCORE_WEIGHT +\n\t\t\tsummaryScore * SUMMARY_SCORE_WEIGHT +\n\t\t\tsocialsScore * SOCIAL_SCORE_WEIGHT) /\n\t\tsumOfWeights;\n\n\tconst percentScore = Math.floor(score * 100);\n\treturn percentScore;\n};\n","import {\n\tIPFS_HASH_LENGTH,\n\tMAX_MEDIA_COUNT,\n\tMEDIA_UPLOAD_PENDING_SUFFIX,\n\tWIKI_CONTENT_MIN_WORDS,\n\tWIKI_SUMMARY_MAX_LENGTH,\n\tWIKI_TITLE_MAX_LENGTH,\n\tWHITELISTED_DOMAINS,\n\tWHITELISTED_LINK_NAMES,\n} from \"../data/constants\";\nimport { CommonMetaIds, MediaSource, MediaType, type Wiki } from \"../schema\";\nimport { countWords, isValidUrl } from \"./wiki-helpers\";\n\n/**\n * Checks if all content links in the given text are verified.\n * @param content - The content to check for links.\n * @returns True if all links are verified, false otherwise.\n */\nexport const areContentLinksVerified = (content: string) => {\n\tconst markdownLinks = content.match(/\\[(.*?)\\]\\((.*?)\\)/g);\n\treturn (\n\t\tmarkdownLinks?.every((link) => {\n\t\t\tconst [, linkText, linkUrl] =\n\t\t\t\tRegExp(/\\[(.*?)\\]\\((.*?)\\)/).exec(link) || [];\n\n\t\t\tif (\n\t\t\t\tlinkText &&\n\t\t\t\tlinkUrl &&\n\t\t\t\tWHITELISTED_LINK_NAMES.includes(linkText) &&\n\t\t\t\t!isValidUrl(linkUrl)\n\t\t\t) {\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tif (linkUrl && !linkUrl.startsWith(\"#\")) {\n\t\t\t\tconst validDomainPattern = new RegExp(\n\t\t\t\t\t`^https?://(www\\\\.)?(${WHITELISTED_DOMAINS.join(\"|\")})`,\n\t\t\t\t);\n\t\t\t\treturn validDomainPattern.test(linkUrl);\n\t\t\t}\n\t\t\treturn true;\n\t\t}) ?? true\n\t);\n};\n\n/**\n * Checks if the media in the wiki is valid.\n * @param wiki - The wiki object to check.\n * @returns True if the media is valid, false otherwise.\n */\nexport const isMediaValid = (wiki: Wiki) => {\n\tif (!wiki.media) return true;\n\n\tconst isMediaContentValid = wiki.media.every((media) => {\n\t\tif (\n\t\t\tmedia.source === MediaSource.Enum.IPFS_IMG ||\n\t\t\tmedia.source === MediaSource.Enum.IPFS_VID\n\t\t) {\n\t\t\treturn media.id.length === IPFS_HASH_LENGTH;\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.YOUTUBE) {\n\t\t\tconst youtubePattern =\n\t\t\t\t/^.*(?:youtu\\.be\\/|v\\/|vi\\/|u\\/\\w\\/|embed\\/|shorts\\/|watch\\?v=)([^#&?]*).*/;\n\t\t\treturn (\n\t\t\t\tmedia.id === `https://www.youtube.com/watch?v=${media.name}` &&\n\t\t\t\tyoutubePattern.test(media.id)\n\t\t\t);\n\t\t}\n\n\t\tif (media.source === MediaSource.Enum.VIMEO) {\n\t\t\treturn media.id === `https://vimeo.com/${media.name}`;\n\t\t}\n\n\t\treturn media.type ? MediaType.options.includes(media.type) : true;\n\t});\n\n\tconst iconMediaCount = wiki.media.filter(\n\t\t(media) => media.type === MediaType.Enum.ICON,\n\t).length;\n\n\treturn (\n\t\twiki.media.length <= MAX_MEDIA_COUNT &&\n\t\tisMediaContentValid &&\n\t\ticonMediaCount <= 1\n\t);\n};\n\n/**\n * Checks if any media in the wiki is still uploading.\n * @param wiki - The wiki object to check.\n * @returns True if any media is still uploading, false otherwise.\n */\nexport const isAnyMediaUploading = (wiki: Wiki) =>\n\twiki.media?.some((media) => media.id.endsWith(MEDIA_UPLOAD_PENDING_SUFFIX)) ??\n\tfalse;\n\n/**\n * Checks if the event URL is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event URL is missing, false otherwise.\n */\nexport const isEventUrlMissing = (wiki: Wiki) => {\n\tif (wiki.tags.some((tag) => tag.id === \"Events\")) {\n\t\tconst referencesData =\n\t\t\twiki.metadata.find((meta) => meta.id === CommonMetaIds.Enum.references)\n\t\t\t\t?.value || \"[]\";\n\t\tconst references = JSON.parse(referencesData);\n\t\treturn !references.some(\n\t\t\t(item: { description: string }) =>\n\t\t\t\titem.description.toLowerCase() === \"event link\",\n\t\t);\n\t}\n\treturn false;\n};\n\n/**\n * Checks if the event date is missing for an event wiki.\n * @param wiki - The wiki object to check.\n * @returns True if the event date is missing, false otherwise.\n */\nexport const isEventDateMissing = (wiki: Wiki) =>\n\twiki.tags.some((tag) => tag.id === \"Events\") && wiki.events?.length === 0;\n\n/**\n * Checks if the wiki summary exceeds the maximum length.\n * @param wiki - The wiki object to check.\n * @returns True if the summary exceeds the limit, false otherwise.\n */\nexport const isSummaryTooLong = (wiki: Wiki) =>\n\t!!(wiki.summary && wiki.summary.length > WIKI_SUMMARY_MAX_LENGTH);\n\n/**\n * Checks if the wiki has no citations.\n * @param wiki - The wiki object to check.\n * @returns True if there are no citations, false otherwise.\n */\nexport const hasNoCitations = (wiki: Wiki) => {\n\tconst references = wiki.metadata.find(\n\t\t(meta) => meta.id === CommonMetaIds.Enum.references,\n\t);\n\treturn !references?.value || references.value.length === 0;\n};\n\n/**\n * Validates a wiki object and returns the validation result.\n * @param wiki - The wiki object to validate.\n * @returns An object containing the validation result and an error message if applicable.\n */\nexport const validateWiki = (wiki: Wiki) => {\n\tconst wordCount = countWords(wiki.content || \"\");\n\n\tif (!wiki.title) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a Title at the top for this Wiki to continue\",\n\t\t};\n\t}\n\n\tif (wiki.title.length > WIKI_TITLE_MAX_LENGTH) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Title should be less than ${WIKI_TITLE_MAX_LENGTH} characters`,\n\t\t};\n\t}\n\n\tif (!wiki.content) {\n\t\treturn { isValid: false, error: \"Add a Content section to continue\" };\n\t}\n\n\tif (wordCount < WIKI_CONTENT_MIN_WORDS) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Add a minimum of ${WIKI_CONTENT_MIN_WORDS} words in the content section to continue. You have written ${wordCount}`,\n\t\t};\n\t}\n\n\tif (!areContentLinksVerified(wiki.content)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Please remove all external links from the content\",\n\t\t};\n\t}\n\n\tif (!wiki.images?.length) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Add a main image on the right column to continue\",\n\t\t};\n\t}\n\n\tif (wiki.categories.length === 0) {\n\t\treturn { isValid: false, error: \"Add one category to continue\" };\n\t}\n\n\tif (isSummaryTooLong(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: `Summary exceeds maximum limit of ${WIKI_SUMMARY_MAX_LENGTH}`,\n\t\t};\n\t}\n\n\tif (isAnyMediaUploading(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror: \"Some media are still uploading, please wait\",\n\t\t};\n\t}\n\n\tif (hasNoCitations(wiki)) {\n\t\treturn { isValid: false, error: \"Please add at least one citation\" };\n\t}\n\n\tif (isEventUrlMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t\"Please cite the event official website with 'Event Link' description\",\n\t\t};\n\t}\n\n\tif (isEventDateMissing(wiki)) {\n\t\treturn {\n\t\t\tisValid: false,\n\t\t\terror:\n\t\t\t\t'Please open the \"Edit Wiki Details Modal\" and enter a valid event date',\n\t\t};\n\t}\n\n\tif (!isMediaValid(wiki)) {\n\t\treturn { isValid: false, error: \"Media is invalid\" };\n\t}\n\n\treturn { isValid: true };\n};\n","import crypto from \"node:crypto\";\nimport OAuth from \"oauth-1.0a\";\n\ntype HttpMethod = \"GET\" | \"POST\" | \"PUT\" | \"DELETE\" | \"PATCH\";\n\ninterface IDiscordLogger {\n\tlog(data: DiscordLogData): Promise<void>;\n}\n\ntype DiscordLogData = {\n\tmessage: string;\n\ttitle?: string;\n\tcolor?: number;\n};\n\nexport const oauth = new OAuth({\n\tconsumer: {\n\t\tkey: process.env.TWITTER_CONSUMER_KEY ?? \"\",\n\t\tsecret: process.env.TWITTER_CONSUMER_SECRET ?? \"\",\n\t},\n\tsignature_method: \"HMAC-SHA1\",\n\thash_function: (base_string, key) => {\n\t\treturn crypto.createHmac(\"sha1\", key).update(base_string).digest(\"base64\");\n\t},\n});\n\nconst twitterAuthConfig = {\n\tkey: process.env.TWITTER_ACCESS_TOKEN ?? \"\",\n\tsecret: process.env.TWITTER_ACCESS_TOKEN_SECRET ?? \"\",\n};\n\nexport async function sendTwitterApiRequest(\n\turl: string,\n\tmethod: HttpMethod,\n\tlogger?: IDiscordLogger,\n\tbody?: string,\n): Promise<Response> {\n\tif (!url.startsWith(\"https://api.twitter.com/\")) {\n\t\tthrow new Error(\"Invalid Twitter API URL\");\n\t}\n\tconst oauth_headers = oauth.toHeader(\n\t\toauth.authorize(\n\t\t\t{\n\t\t\t\turl,\n\t\t\t\tmethod,\n\t\t\t},\n\t\t\ttwitterAuthConfig,\n\t\t),\n\t);\n\n\tconst response = await fetch(url, {\n\t\tmethod,\n\t\theaders: {\n\t\t\t...oauth_headers,\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t\tbody,\n\t});\n\n\tif (!response.ok) {\n\t\tconst errorBody = await response.text();\n\t\tlogger?.log({\n\t\t\tmessage: `🚨 HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,\n\t\t\ttitle: \"Twitter Authentication: makeAuthenticatedRequest\",\n\t\t});\n\t\tthrow new Error(\n\t\t\t`HTTP error! status: ${response.status} ${response.statusText}. Body: ${errorBody}`,\n\t\t);\n\t}\n\n\treturn response;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@everipedia/iq-utils",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "Common utility library for IQ projects",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"keywords": [],
|
|
11
11
|
"dependencies": {
|
|
12
12
|
"axios": "^1.7.7",
|
|
13
|
+
"oauth-1.0a": "^2.2.6",
|
|
13
14
|
"quick-lru": "^7.0.0",
|
|
14
15
|
"zod": "^3.23.8"
|
|
15
16
|
},
|
|
@@ -18,6 +19,7 @@
|
|
|
18
19
|
"@changesets/cli": "^2.24.0",
|
|
19
20
|
"@types/node": "^22.7.4",
|
|
20
21
|
"changeset": "^0.2.6",
|
|
22
|
+
"husky": "^9.1.7",
|
|
21
23
|
"lint-staged": "^15.2.10",
|
|
22
24
|
"tsup": "^8.3.0",
|
|
23
25
|
"typescript": "^4.7.4",
|