@everipedia/iq-utils 2.0.8 → 2.0.10

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 CHANGED
@@ -1,5 +1,17 @@
1
1
  ## 0.2.8
2
2
 
3
+ ## 2.0.10
4
+
5
+ ### Patch Changes
6
+
7
+ - 0b45fb7: make media size string or number
8
+
9
+ ## 2.0.9
10
+
11
+ ### Patch Changes
12
+
13
+ - 3f7a4d2: Changes cache stragegy for getExplorers on wiki zod schema
14
+
3
15
  ## 2.0.8
4
16
 
5
17
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -100,7 +100,7 @@ declare const Image: z.ZodObject<{
100
100
  type Image = z.infer<typeof Image>;
101
101
  declare const Media: z.ZodObject<{
102
102
  id: z.ZodString;
103
- size: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
+ size: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
104
104
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
105
  type: z.ZodOptional<z.ZodNullable<z.ZodEnum<["GALLERY", "ICON"]>>>;
106
106
  caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -109,17 +109,17 @@ declare const Media: z.ZodObject<{
109
109
  }, "strip", z.ZodTypeAny, {
110
110
  id: string;
111
111
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
112
- size?: string | null | undefined;
113
- name?: string | null | undefined;
114
112
  type?: "GALLERY" | "ICON" | null | undefined;
113
+ size?: string | number | null | undefined;
114
+ name?: string | null | undefined;
115
115
  caption?: string | null | undefined;
116
116
  thumbnail?: string | null | undefined;
117
117
  }, {
118
118
  id: string;
119
119
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
120
- size?: string | null | undefined;
121
- name?: string | null | undefined;
122
120
  type?: "GALLERY" | "ICON" | null | undefined;
121
+ size?: string | number | null | undefined;
122
+ name?: string | null | undefined;
123
123
  caption?: string | null | undefined;
124
124
  thumbnail?: string | null | undefined;
125
125
  }>;
@@ -227,7 +227,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
227
227
  }[]>;
228
228
  media: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodObject<{
229
229
  id: z.ZodString;
230
- size: z.ZodOptional<z.ZodNullable<z.ZodString>>;
230
+ size: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
231
231
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
232
232
  type: z.ZodOptional<z.ZodNullable<z.ZodEnum<["GALLERY", "ICON"]>>>;
233
233
  caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -236,33 +236,33 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
236
236
  }, "strip", z.ZodTypeAny, {
237
237
  id: string;
238
238
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
239
- size?: string | null | undefined;
240
- name?: string | null | undefined;
241
239
  type?: "GALLERY" | "ICON" | null | undefined;
240
+ size?: string | number | null | undefined;
241
+ name?: string | null | undefined;
242
242
  caption?: string | null | undefined;
243
243
  thumbnail?: string | null | undefined;
244
244
  }, {
245
245
  id: string;
246
246
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
247
- size?: string | null | undefined;
248
- name?: string | null | undefined;
249
247
  type?: "GALLERY" | "ICON" | null | undefined;
248
+ size?: string | number | null | undefined;
249
+ name?: string | null | undefined;
250
250
  caption?: string | null | undefined;
251
251
  thumbnail?: string | null | undefined;
252
252
  }>, "many">, {
253
253
  id: string;
254
254
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
255
- size?: string | null | undefined;
256
- name?: string | null | undefined;
257
255
  type?: "GALLERY" | "ICON" | null | undefined;
256
+ size?: string | number | null | undefined;
257
+ name?: string | null | undefined;
258
258
  caption?: string | null | undefined;
259
259
  thumbnail?: string | null | undefined;
260
260
  }[], {
261
261
  id: string;
262
262
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
263
- size?: string | null | undefined;
264
- name?: string | null | undefined;
265
263
  type?: "GALLERY" | "ICON" | null | undefined;
264
+ size?: string | number | null | undefined;
265
+ name?: string | null | undefined;
266
266
  caption?: string | null | undefined;
267
267
  thumbnail?: string | null | undefined;
268
268
  }[]>>;
@@ -390,9 +390,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
390
390
  media?: {
391
391
  id: string;
392
392
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
393
- size?: string | null | undefined;
394
- name?: string | null | undefined;
395
393
  type?: "GALLERY" | "ICON" | null | undefined;
394
+ size?: string | number | null | undefined;
395
+ name?: string | null | undefined;
396
396
  caption?: string | null | undefined;
397
397
  thumbnail?: string | null | undefined;
398
398
  }[] | undefined;
@@ -438,9 +438,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
438
438
  media?: {
439
439
  id: string;
440
440
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
441
- size?: string | null | undefined;
442
- name?: string | null | undefined;
443
441
  type?: "GALLERY" | "ICON" | null | undefined;
442
+ size?: string | number | null | undefined;
443
+ name?: string | null | undefined;
444
444
  caption?: string | null | undefined;
445
445
  thumbnail?: string | null | undefined;
446
446
  }[] | undefined;
@@ -500,9 +500,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
500
500
  media?: {
501
501
  id: string;
502
502
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
503
- size?: string | null | undefined;
504
- name?: string | null | undefined;
505
503
  type?: "GALLERY" | "ICON" | null | undefined;
504
+ size?: string | number | null | undefined;
505
+ name?: string | null | undefined;
506
506
  caption?: string | null | undefined;
507
507
  thumbnail?: string | null | undefined;
508
508
  }[] | undefined;
@@ -548,9 +548,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
548
548
  media?: {
549
549
  id: string;
550
550
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
551
- size?: string | null | undefined;
552
- name?: string | null | undefined;
553
551
  type?: "GALLERY" | "ICON" | null | undefined;
552
+ size?: string | number | null | undefined;
553
+ name?: string | null | undefined;
554
554
  caption?: string | null | undefined;
555
555
  thumbnail?: string | null | undefined;
556
556
  }[] | undefined;
package/dist/index.d.ts CHANGED
@@ -100,7 +100,7 @@ declare const Image: z.ZodObject<{
100
100
  type Image = z.infer<typeof Image>;
101
101
  declare const Media: z.ZodObject<{
102
102
  id: z.ZodString;
103
- size: z.ZodOptional<z.ZodNullable<z.ZodString>>;
103
+ size: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
104
104
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
105
105
  type: z.ZodOptional<z.ZodNullable<z.ZodEnum<["GALLERY", "ICON"]>>>;
106
106
  caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -109,17 +109,17 @@ declare const Media: z.ZodObject<{
109
109
  }, "strip", z.ZodTypeAny, {
110
110
  id: string;
111
111
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
112
- size?: string | null | undefined;
113
- name?: string | null | undefined;
114
112
  type?: "GALLERY" | "ICON" | null | undefined;
113
+ size?: string | number | null | undefined;
114
+ name?: string | null | undefined;
115
115
  caption?: string | null | undefined;
116
116
  thumbnail?: string | null | undefined;
117
117
  }, {
118
118
  id: string;
119
119
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
120
- size?: string | null | undefined;
121
- name?: string | null | undefined;
122
120
  type?: "GALLERY" | "ICON" | null | undefined;
121
+ size?: string | number | null | undefined;
122
+ name?: string | null | undefined;
123
123
  caption?: string | null | undefined;
124
124
  thumbnail?: string | null | undefined;
125
125
  }>;
@@ -227,7 +227,7 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
227
227
  }[]>;
228
228
  media: z.ZodOptional<z.ZodEffects<z.ZodArray<z.ZodObject<{
229
229
  id: z.ZodString;
230
- size: z.ZodOptional<z.ZodNullable<z.ZodString>>;
230
+ size: z.ZodOptional<z.ZodNullable<z.ZodUnion<[z.ZodString, z.ZodNumber]>>>;
231
231
  name: z.ZodOptional<z.ZodNullable<z.ZodString>>;
232
232
  type: z.ZodOptional<z.ZodNullable<z.ZodEnum<["GALLERY", "ICON"]>>>;
233
233
  caption: z.ZodOptional<z.ZodNullable<z.ZodString>>;
@@ -236,33 +236,33 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
236
236
  }, "strip", z.ZodTypeAny, {
237
237
  id: string;
238
238
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
239
- size?: string | null | undefined;
240
- name?: string | null | undefined;
241
239
  type?: "GALLERY" | "ICON" | null | undefined;
240
+ size?: string | number | null | undefined;
241
+ name?: string | null | undefined;
242
242
  caption?: string | null | undefined;
243
243
  thumbnail?: string | null | undefined;
244
244
  }, {
245
245
  id: string;
246
246
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
247
- size?: string | null | undefined;
248
- name?: string | null | undefined;
249
247
  type?: "GALLERY" | "ICON" | null | undefined;
248
+ size?: string | number | null | undefined;
249
+ name?: string | null | undefined;
250
250
  caption?: string | null | undefined;
251
251
  thumbnail?: string | null | undefined;
252
252
  }>, "many">, {
253
253
  id: string;
254
254
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
255
- size?: string | null | undefined;
256
- name?: string | null | undefined;
257
255
  type?: "GALLERY" | "ICON" | null | undefined;
256
+ size?: string | number | null | undefined;
257
+ name?: string | null | undefined;
258
258
  caption?: string | null | undefined;
259
259
  thumbnail?: string | null | undefined;
260
260
  }[], {
261
261
  id: string;
262
262
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
263
- size?: string | null | undefined;
264
- name?: string | null | undefined;
265
263
  type?: "GALLERY" | "ICON" | null | undefined;
264
+ size?: string | number | null | undefined;
265
+ name?: string | null | undefined;
266
266
  caption?: string | null | undefined;
267
267
  thumbnail?: string | null | undefined;
268
268
  }[]>>;
@@ -390,9 +390,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
390
390
  media?: {
391
391
  id: string;
392
392
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
393
- size?: string | null | undefined;
394
- name?: string | null | undefined;
395
393
  type?: "GALLERY" | "ICON" | null | undefined;
394
+ size?: string | number | null | undefined;
395
+ name?: string | null | undefined;
396
396
  caption?: string | null | undefined;
397
397
  thumbnail?: string | null | undefined;
398
398
  }[] | undefined;
@@ -438,9 +438,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
438
438
  media?: {
439
439
  id: string;
440
440
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
441
- size?: string | null | undefined;
442
- name?: string | null | undefined;
443
441
  type?: "GALLERY" | "ICON" | null | undefined;
442
+ size?: string | number | null | undefined;
443
+ name?: string | null | undefined;
444
444
  caption?: string | null | undefined;
445
445
  thumbnail?: string | null | undefined;
446
446
  }[] | undefined;
@@ -500,9 +500,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
500
500
  media?: {
501
501
  id: string;
502
502
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
503
- size?: string | null | undefined;
504
- name?: string | null | undefined;
505
503
  type?: "GALLERY" | "ICON" | null | undefined;
504
+ size?: string | number | null | undefined;
505
+ name?: string | null | undefined;
506
506
  caption?: string | null | undefined;
507
507
  thumbnail?: string | null | undefined;
508
508
  }[] | undefined;
@@ -548,9 +548,9 @@ declare const Wiki: z.ZodEffects<z.ZodObject<{
548
548
  media?: {
549
549
  id: string;
550
550
  source: "IPFS_IMG" | "VIMEO" | "YOUTUBE" | "IPFS_VID";
551
- size?: string | null | undefined;
552
- name?: string | null | undefined;
553
551
  type?: "GALLERY" | "ICON" | null | undefined;
552
+ size?: string | number | null | undefined;
553
+ name?: string | null | undefined;
554
554
  caption?: string | null | undefined;
555
555
  thumbnail?: string | null | undefined;
556
556
  }[] | undefined;
package/dist/index.js CHANGED
@@ -2,11 +2,12 @@
2
2
 
3
3
  var zod = require('zod');
4
4
  var axios = require('axios');
5
- var axiosCacheInterceptor = require('axios-cache-interceptor');
5
+ var QuickLRU = require('quick-lru');
6
6
 
7
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
8
 
9
9
  var axios__default = /*#__PURE__*/_interopDefault(axios);
10
+ var QuickLRU__default = /*#__PURE__*/_interopDefault(QuickLRU);
10
11
 
11
12
  // src/data/constants.ts
12
13
  var WIKI_SUMMARY_MAX_LENGTH = 255;
@@ -135,31 +136,33 @@ async function transformAndFilterMetadata(metadata) {
135
136
  function transformAndFilterTags(tags) {
136
137
  return tags.filter((tag) => Tag.safeParse(tag.id).success).map((tag) => ({ id: tag.id }));
137
138
  }
138
- var api = axiosCacheInterceptor.setupCache(
139
- axios__default.default.create({
140
- baseURL: "https://graph.everipedia.org/graphql",
141
- headers: {
142
- "Content-Type": "application/json"
143
- }
144
- }),
145
- {
146
- storage: axiosCacheInterceptor.buildWebStorage(localStorage, "axios-cache:"),
147
- ttl: 12 * 60 * 60 * 1e3,
148
- // 12 hours
149
- interpretHeader: false
139
+ var cache = new QuickLRU__default.default({
140
+ maxSize: 1e3,
141
+ maxAge: 12 * 60 * 60 * 1e3
142
+ // 12 hours
143
+ });
144
+ var api = axios__default.default.create({
145
+ baseURL: "https://graph.everipedia.org/graphql",
146
+ headers: {
147
+ "Content-Type": "application/json"
150
148
  }
151
- );
149
+ });
152
150
  async function getExplorers() {
151
+ const cacheKey = "explorers";
152
+ const cachedData = cache.get(cacheKey);
153
+ if (cachedData) {
154
+ return cachedData;
155
+ }
153
156
  const query = `
154
- query ExplorersList($offset: Int!, $limit: Int!) {
155
- explorers(offset: $offset, limit: $limit) {
156
- id
157
- baseUrl
158
- explorer
159
- hidden
160
- }
161
- }
162
- `;
157
+ query ExplorersList($offset: Int!, $limit: Int!) {
158
+ explorers(offset: $offset, limit: $limit) {
159
+ id
160
+ baseUrl
161
+ explorer
162
+ hidden
163
+ }
164
+ }
165
+ `;
163
166
  const { data } = await api.post("", {
164
167
  query,
165
168
  variables: {
@@ -167,7 +170,9 @@ async function getExplorers() {
167
170
  limit: 30
168
171
  }
169
172
  });
170
- return data.data.explorers;
173
+ const explorers = data.data.explorers;
174
+ cache.set(cacheKey, explorers);
175
+ return explorers;
171
176
  }
172
177
 
173
178
  // src/schema/index.ts
@@ -279,7 +284,7 @@ var Image = zod.z.object({
279
284
  });
280
285
  var Media = zod.z.object({
281
286
  id: zod.z.string(),
282
- size: zod.z.string().nullish(),
287
+ size: zod.z.union([zod.z.string(), zod.z.number()]).nullish(),
283
288
  name: zod.z.string().nullish(),
284
289
  type: MediaType.nullish(),
285
290
  caption: zod.z.string().nullish(),
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":["setupCache","axios","buildWebStorage","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 {\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\";\nimport { setupCache, buildWebStorage } from \"axios-cache-interceptor\";\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=)([^#&?]*).*/;\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 api = setupCache(\n\taxios.create({\n\t\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t}),\n\t{\n\t\tstorage: buildWebStorage(localStorage, \"axios-cache:\"),\n\t\tttl: 12 * 60 * 60 * 1000, // 12 hours\n\t\tinterpretHeader: false,\n\t},\n);\n\nexport async function getExplorers() {\n\tconst query = `\n\t\tquery ExplorersList($offset: Int!, $limit: Int!) {\n\t\t\texplorers(offset: $offset, limit: $limit) {\n\t\t\t\tid\n\t\t\t\tbaseUrl\n\t\t\t\texplorer\n\t\t\t\thidden\n\t\t\t}\n\t\t}\n\t`;\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\treturn data.data.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.string().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.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z.array(z.string()).nullish(),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({}),\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"],"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=)([^#&?]*).*/;\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.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z.array(z.string()).nullish(),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({}),\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"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,6 @@
1
1
  import { z } from 'zod';
2
2
  import axios from 'axios';
3
- import { setupCache, buildWebStorage } from 'axios-cache-interceptor';
3
+ import QuickLRU from 'quick-lru';
4
4
 
5
5
  // src/data/constants.ts
6
6
  var WIKI_SUMMARY_MAX_LENGTH = 255;
@@ -129,31 +129,33 @@ async function transformAndFilterMetadata(metadata) {
129
129
  function transformAndFilterTags(tags) {
130
130
  return tags.filter((tag) => Tag.safeParse(tag.id).success).map((tag) => ({ id: tag.id }));
131
131
  }
132
- var api = setupCache(
133
- axios.create({
134
- baseURL: "https://graph.everipedia.org/graphql",
135
- headers: {
136
- "Content-Type": "application/json"
137
- }
138
- }),
139
- {
140
- storage: buildWebStorage(localStorage, "axios-cache:"),
141
- ttl: 12 * 60 * 60 * 1e3,
142
- // 12 hours
143
- interpretHeader: false
132
+ var cache = new QuickLRU({
133
+ maxSize: 1e3,
134
+ maxAge: 12 * 60 * 60 * 1e3
135
+ // 12 hours
136
+ });
137
+ var api = axios.create({
138
+ baseURL: "https://graph.everipedia.org/graphql",
139
+ headers: {
140
+ "Content-Type": "application/json"
144
141
  }
145
- );
142
+ });
146
143
  async function getExplorers() {
144
+ const cacheKey = "explorers";
145
+ const cachedData = cache.get(cacheKey);
146
+ if (cachedData) {
147
+ return cachedData;
148
+ }
147
149
  const query = `
148
- query ExplorersList($offset: Int!, $limit: Int!) {
149
- explorers(offset: $offset, limit: $limit) {
150
- id
151
- baseUrl
152
- explorer
153
- hidden
154
- }
155
- }
156
- `;
150
+ query ExplorersList($offset: Int!, $limit: Int!) {
151
+ explorers(offset: $offset, limit: $limit) {
152
+ id
153
+ baseUrl
154
+ explorer
155
+ hidden
156
+ }
157
+ }
158
+ `;
157
159
  const { data } = await api.post("", {
158
160
  query,
159
161
  variables: {
@@ -161,7 +163,9 @@ async function getExplorers() {
161
163
  limit: 30
162
164
  }
163
165
  });
164
- return data.data.explorers;
166
+ const explorers = data.data.explorers;
167
+ cache.set(cacheKey, explorers);
168
+ return explorers;
165
169
  }
166
170
 
167
171
  // src/schema/index.ts
@@ -273,7 +277,7 @@ var Image = z.object({
273
277
  });
274
278
  var Media = z.object({
275
279
  id: z.string(),
276
- size: z.string().nullish(),
280
+ size: z.union([z.string(), z.number()]).nullish(),
277
281
  name: z.string().nullish(),
278
282
  type: MediaType.nullish(),
279
283
  caption: z.string().nullish(),
@@ -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 {\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\";\nimport { setupCache, buildWebStorage } from \"axios-cache-interceptor\";\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=)([^#&?]*).*/;\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 api = setupCache(\n\taxios.create({\n\t\tbaseURL: \"https://graph.everipedia.org/graphql\",\n\t\theaders: {\n\t\t\t\"Content-Type\": \"application/json\",\n\t\t},\n\t}),\n\t{\n\t\tstorage: buildWebStorage(localStorage, \"axios-cache:\"),\n\t\tttl: 12 * 60 * 60 * 1000, // 12 hours\n\t\tinterpretHeader: false,\n\t},\n);\n\nexport async function getExplorers() {\n\tconst query = `\n\t\tquery ExplorersList($offset: Int!, $limit: Int!) {\n\t\t\texplorers(offset: $offset, limit: $limit) {\n\t\t\t\tid\n\t\t\t\tbaseUrl\n\t\t\t\texplorer\n\t\t\t\thidden\n\t\t\t}\n\t\t}\n\t`;\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\treturn data.data.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.string().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.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z.array(z.string()).nullish(),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({}),\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"],"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=)([^#&?]*).*/;\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.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.founders]: z.array(z.string()).nullish(),\n\t\t\t\t[LinkedWikiKey.Enum.speakers]: z.array(z.string()).nullish(),\n\t\t\t})\n\t\t\t.nullish()\n\t\t\t.default({}),\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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@everipedia/iq-utils",
3
- "version": "2.0.8",
3
+ "version": "2.0.10",
4
4
  "description": "Common utility library for IQ projects",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -10,7 +10,7 @@
10
10
  "keywords": [],
11
11
  "dependencies": {
12
12
  "axios": "^1.7.7",
13
- "axios-cache-interceptor": "^1.6.2",
13
+ "quick-lru": "^7.0.0",
14
14
  "zod": "^3.23.8"
15
15
  },
16
16
  "devDependencies": {
@@ -20,7 +20,8 @@
20
20
  "changeset": "^0.2.6",
21
21
  "lint-staged": "^15.2.10",
22
22
  "tsup": "^8.3.0",
23
- "typescript": "^4.7.4"
23
+ "typescript": "^4.7.4",
24
+ "vitest": "^2.1.4"
24
25
  },
25
26
  "files": [
26
27
  "dist",
@@ -49,6 +50,8 @@
49
50
  "lint": "lint-staged",
50
51
  "format": "biome format . --write",
51
52
  "lint:fix": "pnpm lint --apply",
52
- "watch:build": "tsc -p tsconfig.json -w"
53
+ "watch:build": "tsc -p tsconfig.json -w",
54
+ "test": "vitest",
55
+ "coverage": "vitest run --coverage"
53
56
  }
54
57
  }